|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Я балуюсь vbscript, не программер. Иногда сталкиваюсь с такими странностями поведения кода, что ну прям бесит... Может ли кто-нибудь объяснить такое: Есть код, запишу примерно, чтобы был ясен смысл. Function N1(...) d = ставим к.-н. число Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8.
Модератор: Учимся использовать тэги оформления кода - FAQ А теперь собственно вопрос: как может быть так, что подставляя в d одно целое положительное число все прекрасно работает, а подставив другое - возникает петля?! Из второй функции не возвращаются x, y, z или d - там тупо другие имена переменных. Что это вообще за бред происходит??? Как может число предела цикла d как-то повлиять на функцию N2? Понятное дело, я конечно разберусь в итоге в чем дело (наверное) или как-то иначе решу проблему.. мне просто неясно вообще как такое может быть??? А с какими "необъяснимыми" вещами в vbscript сталкивались вы?) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:22 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
с приведенным кодом никаких проблем нет почему бы не привести код, в котором проблему можно воспроизвести? Причины могут быть от передачи переменных byref до изменения глобальных переменных x,y,z за пределами цикла Что подразумевается под петлёй - тоже неясно. Бесконечный цикл? Ну так надо посмотреть динамику изменения переменных цикла и станет ясно. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:27 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Да, бесконечный цикл. Переменные в фенкции N2 имеют свои имена, так что по идее никак не могут повлиять на d или x, y, z. Т.е. грубо говоря я ставлю d = 40 - все работает от начала до конца. Если выборку ставлю больше, типа d = 252 - виснет на определенном месте - т.е. прога доходит до обработки конкретных x,y,z и все.)) При d=40 при тех же x,y,z все пролетает на раз. Только зарегался - не судите строго за теги.)) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Так, еще раз. В приведенном коде проблемы нет. Проблема в функции значит. Ее код ты не приводишь Чем мы можем помочь? user-77 бесконечный цикл user-77 виснет на определенном месте ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 21:51 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, На 95% уверен, что бесконечный цикл (виснуть там нечему вроде). В целом вопрос скорее не о том, как мне найти ошибку и ее исправить, а более глобальный. Суть вопроса в том, что КАК отлаживать код, если в итоге обнаружить ошибку можно только случайно? А на тупой перебор всех вариантов, чтобы подтвердить работоспособность кода на все 100% уйдут месяцы или вообще жизни не хватит? Читал такую статью по математическим вычислениям или точнее поиску алгоритмов тупым перебором - суть которой в том, что код становится своего рода черным ящиком - когда время выполнения становится таким, что уже невозможно определить работает ли программа или она зависла или с ней что-то произошло непредвиденное и т.д. Как же программировать в таком случае? Как убедиться в его работоспособности, если ты просто не можешь проверить все. Допустим здесь действительно все относительно легко - 40-250 можно проверить, а когда вариантов запредельное число? В конце-концов здесь (в моем случае) я могу вообще начать с проблемной строки и думаю в чем дело станет ясно, но такая лафа может быть не всегда... и что делать тогда? Советы, идеи?.. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:07 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, Надо пройтись по-коду отладчиком и посмотреть что происходит. Тогда станет понятно в каком месте ошибка. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:11 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Вопрос настолько общий, что ответом может быть например "декомпозиция", "модульное тестирование" и еще какие-то практики. Перебором обычно не проверяют, проверяют крайние и выборочные значения. Кроме того, программы не пишут на vbscript - это просто для каких-то вспомогательных вещей язык. А у серьезных систем разработки существуют и достаточно мощные средства тестирования, и достаточно хорошие практики, и например, статический анализ. Я думаю, что твоя ошибка довольно банальна, типа переполнения вкупе с On error resume next или что-то такое. Для отлова такой ошибки не нужно проверять все возможные варианты, достаточно проверить крайние. Вообще, зацикливание - достаточно редкая ошибка для опытного программиста, чтобы можно было о ней всерьез говорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:16 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Переполнения там точно не может быть, т.к. она остановится с ошибкой. В данном случае модульное тестирование как раз-таки в пролете я так думаю. Изначально был скрипт, который просто строил заданную последовательность на основании вводных данных. Все работало. А потом я решил обращаться к этому коду через цикл, чтобы получить ответ какие из последовательностей удовлетворяют заданным условиям. Я уже писал, что не программер, а любитель. Изучать какой-нибудь паскаль желания особого нет, тем более что большинство моих вопросов можно решить и на vbs. Вопрос в том, что один код у меня выполнялся больше недели. Но в тот раз я точно знал, что там ошибок быть не может. И таки дождался завершения. А в других случаях, я могу не быть уверенным, что какая-нибудь байда не приключится и соответственно даже не буду знать работает она или уже нет.)) Конечно можно писать лог, в который записывать вообще каждый переход программы к следующей операции.. не знаю, может быть это и вариант, но тоже как-то не очень. В общем не знаю, спасибко.. )) ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 22:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Древний анекдот, но как-то ложится в тему Пьяный мужик что-то ищет под фонарем. Тут к нему под ходит милиционер и спрашивает: "Что вы тут делаете?" Мужик отвечает: "Ключи от квартиры ищу". "А где потерял?". "В парке". "А зачем здесь ищешь?". "А здесь светлее ". ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:11 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Ну да.)) Все правильно.. а у кого я еще должен спрашивать? На самом деле может быть много странного.. ну я надеюсь, что не в vbs. А так бог его знает че там происходит.. оно может своей жизнью жить. А виноват в этом двоичный код и пакости вроде IEEE754. Сейчас ищу проблемное место. Постепенно суживаю область. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:19 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 а у кого я еще должен спрашивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:23 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Основная моя проблема вот в чем... у меня не выходит рассчитать время выполнения. Пока мои попытки были безуспешны.. почему-то так происходит, что на первый взгляд зависимость должна быть просто линейной (в другом скрипте), но почему-то это не так.. происходит сильная деградация. Я пытался по первой минуте рассчитывать (типа сколько надо сделать, а сколько сделано за минуту), но результат оказался в 27 раз меньше реально затрачиваемого времени. Вот наверное реальная проблема для меня. То, что я не вижу там нелинейной зависимости и не могу производить более точный расчет времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:33 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Т.е. я хочу сказать, что возможно у меня нет ошибки.. я просто не могу дождаться, потому что мне кажется, что при если при d=40 пролетает относительно быстро, то и и при d=252 будет как-то так. Я просто вчера ждал час и эта ерунда так и не перешла к следующей позиции, хотя при d=40 она за 1,5 минуты выполнялась. Я поэтому и решил, что наверное в коде какая-то ошибка. Но я только сейчас вспомнил, что там есть одна особенность из-за чего может быть действительно все долго. Блин.( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:38 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
А точно этот код нельзя запустить в VBA вместо VBS? Поставить там debug.print для переменной x и все сразу будет наглядно ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:43 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Так как у вас три вложенных цикла, то, по порядку, число выполнений N2 растет с ростом d как d^3=d*d*d В точных значениях цикл первого уровня выполнится (d-1) раз, второго d/2 и третьего - тоже d/2 То есть общее число вызовов k процедуры N2 определяется так k = (d*d*d)/8 - (d*d)/4 Для d = 40 k = 7600, обозначим время работы этого случая за t тогда для d = 252 k = 1984500, значит в таком случае код будет выполнятся за время 261*t это ответ на вопрос user-77Как может число предела цикла d как-то повлиять на функцию N2 При условии, что время работы N2 не зависит от "номера вызова" , общее время работы программы здесь определяется числом вызовов N2, а это число вызовов пропорционально кубу d. Вот и всё. Это ребенок лет 8 обязан понимать. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:55 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Думаю, без проблем можно. Точно, это же можно в экселе? Ну чтобы visual studio не ставить? Я вот тут не очень разбираюсь. У меня есть еще pascal.abc net но я его пока не осваивал. Думал там можно просто как-нибудь интерфейсы делать, но оказалось все плохо. Я вообще не понимаю, почему до сих пор нет нормальных шаблонов виндовых интерфейсов с готовыми кодами, типа вот кнопка "Открыть", вот "сохранить" и т.д. Все же программы они в принципе стандартизированы. У всех есть настройки, опции, какие-то общие часто встрчающиеся вещи. Но не.. все какое-то кривое пипец. В том же экселе вроде более-менее сделано, но дальше то никуда..( ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2021, 23:59 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, пардон, соврамши число вызовов = d^3/4 - d^2/2 для d = 40 k = 15680, время = t для d = 252 k = 3988051 время= 251*t порядка роста это не меняет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:03 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, boobyПри условии, что время работы N2 не зависит от "номера вызова" ладно пусть так будет. Там есть зависимость. Но ее проследить невозможно вообще. Т.е. время выполнения конкретного варианта вычислить нельзя. Как я не пытался. Если точнее, то она должна перебрать больше 2 млн. вариантов. С этим проблем нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:07 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, главное состоит в том, что во втором случае число вызовов N2 в 251 раз больше, чем в первом. Это значит, что программа во втором случае должна работать как минимум в 251 раз дольше, если только работа N2 стабильно не ускоряется, волшебным образом, с увеличением значения d, да так, чтобы кубический рост числа вызовов оказался скомпенсированным. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:17 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 Точно, это же можно в экселе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, Я согласен. О моей проблеме времени выполнения я писал про корневой если так можно выразиться скрипт, похожий на тот, который работает сейчас как N2 к которому я обращаюсь в цикле, только чуть сложнее. Там ты просто задаешь конкретные условия, перебора нет. Никаких вариантов (как с циклом) там нет. Однако, вот именно там и не получается (пока) разобраться с временем выполнения. Именно там процесс сильно деградирует, а почему неясно. Причем первые (не помню уже, 3 вроде) минуты выполнения делают 25% от всей так сказать длины. Но видимо длина (или сумма) на которую я ориентировался, здесь не помощник. Я пытаюсь найти другую "опору", но найти универсальную математическую формулу для расчета пока никак. В части случаев формула правильная, в других нет. Хотя там уже значения ближе и может быть, когда я буду опираться на них, то расчет времени станет точнее, но и здесь пока нет никакой в этом уверенности. Возможно, если бы я был математиком, то смог бы найти формулу, но не факт. Потому что один математик вроде попытался, но ни к чему не пришел. А я пока продолжаю искать, но уже другими методами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Shocker.Pro, Я пока пробую сузить область (если там все же ошибка). Но все больше склоняюсь, что просто оно так долго. Действительно, раньше у меня было 6500 вариантов, а теперь больше 2 млн. Блин. Я изначально думал, выставить d = 1000. А так ведь можно и не дожить.)) Я только сейчас стал осознавать насколько это может быть долгим. И даже не в 300 раз. Хотя посмотрим, если 1,5 - 6500, то 2 млн. - 7,5 часов. Потом, когда буду делать 1000 если решу все-таки, то буду запускать эту хрень на серваке. Благо, есть где можно без проблем держать процесс неделю. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:45 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Хотя все равно все очень странно. Потому что последнее, что она записывает это когда x=3, y=10, z=14 т.е. все что ДО выполняется быстро (в пределах 2 минут) несмотря на d=252!, а все что ПОСЛЕ оооочень долго. Но при этом msg на 3,100 она все-таки выдала спустя ... 40 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:51 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
для того, чтобы провести замеры и оценить характер зависимости времени обработки следующего отрезка той же длины, математиком быть не требуется. Вы рассказываете о том, что что у вас нелинейная зависимость "скорости продвижения" от позиции "ползунка". это значит, что на каждом следующем шаге работы выполняется не просто больше действий, чем на предыдущем, а нелинейно больше. Для грубой оценки времени точные формулы не нужны. при квадратичной зависимости следующие 25% процентов потребуют в 4 раза большего времени, а при кубической - в 8 раз большего. Если, например, окажется, что зависимость кубическая, то после обработки первых 25% вы, за то же время, за которое обработались первые 25% получите в восемь раз меньшую длину продвижения - то есть, около 3.5%., а при квадратичной в 4 раза меньшую - около 6%. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 00:56 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Ох ты ж...)) Во она понаписала.) Все-таки похоже код работает. Она перевалила отметку из-за которой я решил, что с кодом проблема. Просто тупо не дождался. Процесс идет себе дальше и пишет результаты. Вот только комп надо выключать и ложиться спать. Так что в следующий раз видимо буду колбасить его. Там вся фигня в том, что она пишет в файл, только то, что удовлетворяет заданным критериям, а в некотором диапазоне от 3,10,14 она ничего не находит, потому ничего в файл и не пишет. Вот так бывает. Сам себя обманул. Думал, что ошибка какая-то. Но такое тоже бывает вообще. Непредвиденное. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 01:13 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#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 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 ...Я в шоке. Примерно полтора порядка у вас еще остаётся в запасе на разного рода эксперименты, это можно сказать наверняка. Но психологического эффекта такой силы вы, конечно, уже не получите. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 21:25 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
booby, А что такого делает Preserve в данном случае? Индексирует содержимое как-то по-своему или каким-то особым образом работает с оперативой? Везде пишут, что опция просто типа что-то там сохраняет.. никогда не замечал какого-то влияния. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 21:37 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, Спасибки.) Excel не нравится отсутствием автономности. Из скрипта можно легко сделать exe. А для vba еще надо искать компилятор. . Для VBScript не существует компиляторов, EXE который делается из скрипта просто сжимает и шифрует исходник, который перед исполнением распаковывается. Никакой дополнительной автономности такой EXE не дает. Если на машине отключен Windows Script Host (почти на всех офисных пк это делается административной политикой для безопасности) такой экзешник там работать не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 22:10 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 booby, А что такого делает Preserve в данном случае? ... Вы себя вообще нормальным человеком считаете? В каком таком "данном", если вы никакого случая не дали? Если про "вообще" - то "вообще" он может заметать под ковер особенности кода произвольно низкого качества, до каких-то пределов, и при условии наличия большого количества непрерывной свободной памяти непосредственно за пределами уже размещенного массива. Ну, в размерах десятков килобайт на массив - почти несомненно, возможно даже до приличного количества мегабайт, если повезет. Говоря сильно грубо, он позволяет при работе с массивом использовать "экономные" подходы к выделению памяти, отдалённо того же рода, которые используются при работе с "короткими строками", которые вы упоминали. А про его содержательное назначение прилично было бы и в справке почитать, хотя бы по vba. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 22:34 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 Спасибки.) Excel не нравится отсутствием автономности ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 00:03 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
Ребята, че вы так накинулись то? Втроем на одного?)) Отвечаю всем по-порядку: 1. Спецом выключил сервер сценариев на машине с хрюшей и 7-кой. Хрюшу даже перезагрузил. Скрипты, как положено, пишут мол "извините". Экзешник работает как миленький. No problem. 2. booby"Если про "вообще" - то "вообще" он может заметать под ковер особенности кода произвольно низкого качества, до каких-то пределов, и при условии наличия большого количества непрерывной свободной памяти непосредственно за пределами уже размещенного массива. Ну, в размерах десятков килобайт на массив - почти несомненно, возможно даже до приличного количества мегабайт, если повезет. Говоря сильно грубо, он позволяет при работе с массивом использовать "экономные" подходы к выделению памяти, отдалённо того же рода, которые используются при работе с "короткими строками", которые вы упоминали. А про его содержательное назначение прилично было бы и в справке почитать, хотя бы по vba." ... ничего себе, тирада.)) Простите, если я вас как-то задел. В данном случае - это значит внутри цикла. Если честно я вообще не совсем понимаю принцип работы этой опции. У меня было так: без Preserve. Для одного массива в цикле я увеличивал размерность, в другом не менял и тогда ReDim arr(n) срабатывал так же как Erase. По-крайней мере я разницы между ними не увидел. Потребление оперативки было очень низким, а на 64-битной системе еще более низким. Когда я добавил Preserve потребление памяти стало на порядок больше, но и скорость выросла значительно. Одна задача, которая выполнялась 5 часов (!) выполнилась за минуту! Не знаю, можно ли ускорить его еще как-то... читал, что вроде For-Next в циклах якобы работает на порядок медленнее, чем For each. Не знаю, стоит ли мне дальше пытаться оптимизировать код, т.к. вряд ли я добьюсь увеличения скорости еще хотя бы в 2 раза... ИЛИ это все-таки возможно??? Ваше мнение? P.S. На измененном коде с Preserve решил для прикола запустить задачку слегка посложнее. И вот тут, он встрял. За 2,5 часа в лучшем случае он сделал треть. Не дождался и вырубил. Но память... 700 МБ процесс как с куста. Боюсь, если он сделал только треть, то на 32-битке я бы мог упереться в 2ГБ на процесс. 3. Согласен, с вами, Shocker.Pro! Признаюсь честно, я не умею этим дебаггером пользоваться, но я и не пробовал толком. Давно это было. Когда я пробовал написать строковый калькулятор для деления чисел. У меня там какая-то ошибка, мне показалось очень запарным ее искать (в т.ч. по причине большого кол-ва символов) и я на этот код забил. Хотя сам код абсолютно простой. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 03:36 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77, Если Вам ехать а не шашечки - но через VBA пришлите на sia.enters@inbox.lv мы ускоряем всякие хотелки на два порядка и даем инстрУмент людЯм ... |
|||
:
Нравится:
Не нравится:
|
|||
13.04.2021, 10:16 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
MX-9, Вы про калькулятор или про вообще?) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2021, 03:06 |
|
Вопрос к программерам
|
|||
---|---|---|---|
#18+
user-77 MX-9, Вы про калькулятор или про вообще?) Сразу при включении автоматически ексцель отображается вна сервер. Там он крутится резво. Там все то же - листы - ячейки.. Оба ексцеля синхронизированы в обе стороны. Кулкулатор - и тоже всегда пожалуйста. Скиньте мне тестик на VBA - погоняю на скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2021, 08:45 |
|
|
start [/forum/topic.php?all=1&fid=60&tid=2154731]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
others: | 265ms |
total: | 448ms |
0 / 0 |