|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Вопрос в том, что непонятно откуда нелинейность там берется. Там нелинейности нет. Там тупо сделать это, сделать то, перейти к следующему и т.п. Там нет перебора значений или чего-то пододного. Откуда она, эта нелинейность выполнения, если кол-во операций над каждым объектом одинаковое??? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:27 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
из того, что вы сообщаете по числам, выглядит так, ч то у вас "зависимость от d", вероятно выше, чем d^3, может быть даже d^5. Совсем плохо может оказываться, когда временные зависимости выше фиксированной степени d, что нибудь сорта d^d. ... Что-то про свои алгоритмы в частности, и алгоритмы вообще, полезно знать. Почитайте любую книжку по алгоритмам для начинающих . В фундаментальные книги, вроде Кнута, не залезайте. Они и сильно-сильно не для начинающих, и даже вообще не для чтения, практически. Их главная задача - стоять на полке. Вам пока этого не нужно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:29 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Вопрос в том, что непонятно откуда нелинейность там берется. Там нелинейности нет. Там тупо сделать это, сделать то, перейти к следующему и т.п. Там нет перебора значений или чего-то пододного. Откуда она, эта нелинейность выполнения, если кол-во операций над каждым объектом одинаковое??? стоп-стоп. Прежде всего, вы должны довести себя до состояния, когда глядя на пример Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
вы на автомате говорите: "О! Это кубическая зависимость времени выполнения от d" Потом уже можно начинать разбираться с тем кодом, завершения которого вы сейчас ожидаете. (Не видя его, ничего сказать нельзя.) Это правда, что не для всякого кода вообще выводятся точные формулы. Но приближенные оценки можно получить в большинстве случаев. И, экспериментальный подход, не видя кода, просто методом систематических замеров, тоже позволит получить вам оценку, характер зависимости времени выполнения от размера задачи. Для решения вопроса о том, на сколько дней можно уходить спать, этого должно быть достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:38 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Это разные вещи. Тот скрипт, в котором происходит сильная деградация - там в общем нет вызовов из цикла и никакого d= там нет. Там значения задаются вручную, а затем программа работает по опр.алгоритму и выдает результат. Т.е. грубо говоря если на входе у нас 3 значения, то и обрабатываем мы все время 3 значения. Это константа. И над каждым производим какие-то действия, пусть 100 операций - тоже константа. Там неоткуда браться нелинейности выполнения. Кроме разве того, что я опираюсь не совсем на ту величину при расчете этого времени. Но чтобы мне ориентироваться на величину, которая вероятно (только вероятно) более точна эту величину нужно сначала вычислить - и вот для этого как раз нужна формула, которой пока нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:41 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Это не тот скрипт и другой код. Там такого нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:42 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, в том, что вы сейчас пишите - нет смысла. Как вы не видели, почему время выполнения вашего исходного примера кода, которого нет, нелинейно зависит от d, (в конкретном случае - зависимость кубическая.) так и любая из операций, время выполнения которых вы оцениваете как константу, может оказаться нелинейно зависящей от "размера задачи". Например, именно такой особенностью обладает работа со строками. Время склейки двух строк в одну нелинейно зависит от размера склеиваемых строк. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 02:17 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, boobyВремя склейки двух строк в одну нелинейно зависит от размера склеиваемых строк. Не задумывался. Но хотелось бы тогда пояснения - почему? И где узкое место? Неужто склейка двух строк такая трудоемкая операция? Если рассуждать логически - (если я правильно понимаю логику в принципе), то строка А (это набор памяти от адреса n1 до адреса n2), а строка Б - ну соответственно понятно о чем я. Элементарно. Но вот работает ли оперативка именно так при (например) изменении, увеличении строки в цикле или она пишет куда придется, беспорядочно, тогда да.. будет нелинейно как деградация о которой я говорил ранее. Объясните плиз.. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 01:25 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Не очень я врубаюсь какая нелинейная зависимость там. Даже с d. И что? Просто посчитать кол-во вариантов заранее и крутить счетчик. Кстати, если уж пошла такая песня.. не сочтите за.. 1) кто-нибудь пробовал написать строковый калькулятор на vba или vbs? 2) это вообще возможно? 3) если тебе надо 100 тыс. знаков после запятой, то это только pascal и все делать через извраты с R.TryParse(s,res) или как? Значимых цифр у double там, как и у всех 15-16. Буду признателен за разъяснение.) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 01:43 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Не очень я врубаюсь какая нелинейная зависимость там. Даже с d. И что?... вы вообще, о том, что такое "линейная зависимость" представление имеете? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 02:00 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, По вашим словам нет.) Касаемо цикла и d: я могу хоть 50 циклов накрутить и все равно это для меня будет линейным, потому что я знаю сколько раз эти вложенные циклы вызовут основную процедуру. Сами "For" я в расчет не беру, что надо? Вы так пишете, будто цикл - это лошадь на забеге.)) Бежит резво пока силы есть, а потом с каждым витком все медленнее и медленнее, пока не сдохнет.) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 02:17 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, По вашим словам нет.) Касаемо цикла и d: я могу хоть 50 циклов накрутить и все равно это для меня будет линейным... Вы зря улыбаетесь. Вы несомненно не понимаете, о чём пытаетесь рассуждать. "линейная зависимость", это когда на любые равные изменения счетчика, количество вычислений изменяется на одну и ту же величину. Возьмем ваш пример и перепишем так: Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
В таком примере зависимость между изменением значения d и количеством вызовов N2 линейна. Если d = 10, то общее число вызовов N2 = 50 - по пять на каждом шаге из 10. Если вы увеличите d с 10 до 20 (на 10) то количество вызовов N2 увеличится до 100, то есть - на 50. И так, на пятьдесят оно будет увеличиваться при любом изменении счетчика на 10. Не имеет значения, с какого числа начинать увеличение, - с 10, 120, или 255. Вот другой цикл Код: vbnet 1. 2. 3. 4. 5. 6.
Пусть d = 10. Тогда цикл по x будет содержать 10 шагов, на каждом из которых будет запускаться в работу цикл по y, тоже состоящий из 10 шагов. Общее число обращений к N2 окажется 10*10 = 100 То есть, по отношение к d, в среднем, на каждое из его 10 значений процедура будет вызвана 10 раз. Увеличим d на 10 - c 10 до 20. Тогда цикл верхнего уровня окажется состоящий из 20 шагов и вложенный тоже из 20. Но вложенный работает на каждом шаге внешнего, поэтому общее число вызовов N2 станет 20*20=400 То есть в расчете на одно из 20 значений d число вызовов N2 увеличится и окажется уже не 10, а 400/20 = 20 Мы помним, что при d=10 вычислений было 100, при d=20 стало 400, то есть увеличение d на 10 с 10 до 20 добавило 300 дополнительных вызовов N2 к тем 100, которые были при d=10 Увеличим d еще на 10 - с 20 - до 30. На каждом из 30 шагов внешнего цикла будет 30 раз вызываться N2 благодаря внутреннему циклу. Всего вызовов получится 30*30=900, увеличение значения счетчика в на следующие 10 дало уже добавление не 300 новых вызовов, а 900-400 = 500 Построим таблицу: d число вызовов N2 дельта к предыдущему1110100 992040030030900500 То есть, количество добавляющихся вычислений при увеличении счетчика на 10 оказывается зависимым от того значения d, к которому происходит добавление. Это и называют нелинейной зависимостью. В данном случае зависимость квадратична, поскольку общее число вызовов N2 определяется величиной d^2 Добавление каждого следующего цикла вложенного уровня в такой схеме добавляет степень к зависимости скорости роста числа вычислений от d. В вашем исходном примере циклы второго и третьего этажа выполняются переменное число раз, зависимое от текущего значения индекса предыдущего уровня, но в среднем d/2 раз на втором уровне и d/2 раз на третьем. Это не меняет характер роста - он остается как d^3 по порядку величины. По поводу "все равно" или "не все равно". Да любой вложенный цикл с произвольным числом уровней вложений можно представлять себе "просто как одноуровневый цикл". И в этом смысле, можно себе видеть, что они "все линейны". Но в реальности, надо понимать, что такое представление сходится с вышеизложенными соображениями только с учетом нелинейного, скачкообразного изменения верхнего предела индекса при попытке изменения "размера задачи". В общем - не забивайте себе голову, если сами писать не планируете. Просто стребуйте с писателя характеристики времени счета от размера задачи, чтобы приблизительно представлять время ожидания. Ну, или постройте их себе сами экспериментальным путем. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 03:16 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
еще "вчера" надо было счетчик поставить внутрь 3-х этажей и прогнать не функцию а счетчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 09:48 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Это все было понятно с самого начала.) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 18:48 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Это все было понятно с самого начала.) Правильно ли я вас понял, что в вашем вопросе с самого начала не было смысла, и вы заранее знали на него ответ? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 19:05 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Alex_Ustinov, Да, я малость ступил, забыв посмотреть сколько будет вызовов. Уже давно все посчитал, вместе с доп.условиями там выходит > 2 млн. вызовов. Короче, 6500 вызовов она прошла за 1.5 мин., если посчитать пропорционально, то программа должна была бы работать ~ 9.5 часов. Однако, этого там не происходит. И проблема не в кол-ве вызовов, а в самой процедуре. Но там уже время выполнения вычислить нереально. В реальности за 15 часов она дошла лишь до 33 из 252. Можно было бы конечно распараллелить задачу, но меня не устраивает тогда нагрузка на процессор. Так что либо буду останавливать и делать частями, либо пусть так работает. Видимо, понадобится пара недель. Лучше поделитесь, пробовал ли кто-то написать строковый калькулятор, ну хотя бы какую-то операцию, например деление.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 19:07 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Нет. Хотя, вопрос был и правда тупой. Неудачно сложились звезды.)) Я просто думал, что в скрипте ошибка и он ушел в бесконечный цикл. Я сделал три ошибки: 1. забыл посчитать кол-во вызовов 2. забыл, что она пишет только удовлетворяющее заданным критериям и не подумал, что могут быть "провалы", где целые диапазоны "молчат" 3. не знал, что потребление оперативки там может оставаться неизменным в течении большого периода времени. Смесь этих факторов заставила меня усомниться в правильности кода, хотя все было так как должно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 19:15 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
если бы с самого начала разговаривали в терминах своей реальной задачи и показывали код, было бы яснее, можно ли, и что именно, сделать для общего ускорения/понижения степени зависимости от "размера задачи". У меня сохраняется подозрение, что ваша N2 имеет свою степень такой зависимости выше 1. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 20:14 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Вы так и не объяснили, что не так со склейкой строк... и какая там зависимость? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 00:41 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Вы так и не объяснили, что не так со склейкой строк... и какая там зависимость? Зачем вам это? Все хорошо со строками. Если длина склеиваемых строк зависит от d, то просто, при неумелом использовании склейки, добавится еще та степень к зависимости времени выполнения от d, в какой в среднем растут склеиваемые строки в зависимости от d. Когда степень превышает 2, очень быстро становится неинтересно, какая она на самом деле - 3 или 5 или 8. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 01:54 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Что будет быстрее писать в цикле: строку "str = str & ...", динамический массив "arr(n) =" или скидывать/добавлять значения в файл "f.Write(...)" ? Естественно речь идет о десятках миллионов символов и больше... а массив соответственно с UBound больше млн. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 06:02 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Что будет быстрее писать в цикле: строку "str = str & ...", динамический массив "arr(n) =" или скидывать/добавлять значения в файл "f.Write(...)" ? Естественно речь идет о десятках миллионов символов и больше... а массив соответственно с UBound больше млн. это слишком абстрактная постановка вопроса. Может быть - какая-то комбинация из перечисленного. про сложение строк - поищите, на форуме или рядом, в районе 2003-2005 годов должно найтись много разных быстрострокодобавляторов. Какие-то из них должны легко переноситься на vbs, какие-то нет. как вариант: https://www.sql.ru/forum/73509/optimizaciya-raboty-so-strokami Из того, что вы пишете (интересуетесь парсингом) может оказаться, что вам не быстрострокодобавлятор нужен, а всего лишь специализированная коллекция реализующая стек, с линейным (или близким к линейному) в среднем временем работы. И да, к совету про перенос работы в Excel, пожалуй, присоединюсь. Как минимум, вы получите другой уровень отладки. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 08:45 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Спасибки.) Excel не нравится отсутствием автономности. Из скрипта можно легко сделать exe. А для vba еще надо искать компилятор. Может дорасту до паскаля. В этом вероятно и то больше смысла для перехода. Но пока лень его изучать. Или все-таки поставлю visual studio. Если там будет не заморочно с формами работать, то это будет самый лучший вариант. В паскале я попробовал и... ничего не понял. Чтобы стандартное меню сделать можно головой о стену убиться, элементарный файл браузинг так вообще нечто непонятнокакделающееся.)) Сравнил у себя строку и массив. Строка выполнилась за 22 мин. А массив за 31. Может быть из-за ReDim. Кстати опцию Preserve не добавлял. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 16:23 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Забыл сказать, что это без оптимизации (по ссылкам). Просто переделал как было на массив и сравнил производительность. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 16:52 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Короче, по ссылкам, я так понял нужно создать собственный класс, обратиться к какой-то dll-ке (толком не понял к какой, то ли к kernel32, то ли к oleaut32) и затем ЭТО как-то использовать для конкатенации своей строки.. которая у меня в цикле растет, т.к. к ней добавляются все новые значения. ИЛИ можно пытаться контролировать ее рост... это видимо нужно проверять. Много средних строк, которые придется складывать в конце VS одной длинной, к которой добавляются короткие значения. Много рассуждений про короткие и длинные строки. Но по факту сначала строка короткая, а потом она длинная. Особенно доставило это, цитирую: "Короткие строки (по возможности) выделяются из внутреннего кеша в 64К, размещаемого в недрах OleAut32.dll" 64K? Серьезно? И как оно может помочь, когда строка уже длинная? Я наверное чего-то не понимаю... ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 20:32 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Люди! Я не верю собственным глазам! Короче, я вчера экспериментировал с массивом, вместо конкатенации строки. В ходе цикла нужно было менять размер массива по ходу добавления новых значений. Я написал ReDim без задней мысли. Померил результат: строка - 22 минуты, массив 31 минута. Вспомнив о Preserve вставил ее в цикл и... результат 82 секунды! Там правда что-то я малость напортачил + появилась еще другая проблема. Раньше когда я писал строку, мне нужно было запоминать позицию в строке для добавления потом определенных вещей. Как сделать это теперь, когда каждое новое значение пишется в массив?.. Но с производительностью возможно вопрос решился. Весьма неожиданно. В других скриптах я когда добавлял Preserve это никогда ничего по сути не меняло, а сейчас.. Я в шоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 21:17 |
|
|
start [/forum/topic.php?fid=60&msg=40061491&tid=2154731]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
28ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
2ms |
others: | 10ms |
total: | 131ms |
0 / 0 |