powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
59 сообщений из 59, показаны все 3 страниц
Вопрос к программерам
    #40061217
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я балуюсь vbscript, не программер. Иногда сталкиваюсь с такими странностями поведения кода,
что ну прям бесит... Может ли кто-нибудь объяснить такое:

Есть код, запишу примерно, чтобы был ясен смысл.

Function N1(...)

d = ставим к.-н. число

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
For x = 1 To d - 2
  For y = x + 1 To d - 1
    For z = y + 1 To d
    'Здесь идет вызов другой функции, которая собственно и делает то, что требуется
    Call N2(...)
    Next
  Next
Next


Модератор: Учимся использовать тэги оформления кода - FAQ

А теперь собственно вопрос: как может быть так, что подставляя в d одно целое положительное число
все прекрасно работает, а подставив другое - возникает петля?!

Из второй функции не возвращаются x, y, z или d - там тупо другие имена переменных.
Что это вообще за бред происходит???
Как может число предела цикла d как-то повлиять на функцию N2?
Понятное дело, я конечно разберусь в итоге в чем дело (наверное) или
как-то иначе решу проблему.. мне просто неясно вообще как такое может быть???

А с какими "необъяснимыми" вещами в vbscript сталкивались вы?)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061219
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
с приведенным кодом никаких проблем нет
почему бы не привести код, в котором проблему можно воспроизвести?

Причины могут быть от передачи переменных byref до изменения глобальных переменных x,y,z за пределами цикла

Что подразумевается под петлёй - тоже неясно. Бесконечный цикл? Ну так надо посмотреть динамику изменения переменных цикла и станет ясно.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061221
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Да, бесконечный цикл. Переменные в фенкции N2 имеют свои имена, так что по идее никак
не могут повлиять на d или x, y, z. Т.е. грубо говоря я ставлю d = 40 - все работает от начала до конца. Если выборку ставлю больше, типа d = 252 - виснет на определенном месте - т.е. прога доходит до обработки конкретных x,y,z и все.)) При d=40 при тех же x,y,z все пролетает на раз. Только зарегался - не судите строго за теги.))
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061223
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так, еще раз.
В приведенном коде проблемы нет.
Проблема в функции значит.
Ее код ты не приводишь
Чем мы можем помочь?

user-77
бесконечный цикл
user-77
виснет на определенном месте
так ты определись, виснет или бесконечный цикл. Это же не одно и то же
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061228
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

На 95% уверен, что бесконечный цикл (виснуть там нечему вроде). В целом вопрос скорее не о том, как мне найти ошибку и ее исправить, а более глобальный. Суть вопроса в том, что КАК отлаживать код, если в итоге обнаружить ошибку можно только случайно? А на тупой перебор всех вариантов, чтобы подтвердить работоспособность кода на все 100% уйдут месяцы или вообще жизни не хватит? Читал такую статью по математическим вычислениям или точнее поиску алгоритмов тупым перебором - суть которой в том, что код становится своего рода черным ящиком - когда время выполнения становится таким, что уже невозможно определить работает ли программа или она зависла или с ней что-то произошло непредвиденное и т.д. Как же программировать в таком случае? Как убедиться в его работоспособности, если ты просто не можешь проверить все. Допустим здесь действительно все относительно легко - 40-250 можно проверить, а когда вариантов запредельное число? В конце-концов здесь (в моем случае) я могу вообще начать с проблемной строки и думаю в чем дело станет ясно, но такая лафа может быть не всегда... и что делать тогда? Советы, идеи?..
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061230
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

Надо пройтись по-коду отладчиком и посмотреть что происходит.
Тогда станет понятно в каком месте ошибка.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061232
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос настолько общий, что ответом может быть например "декомпозиция", "модульное тестирование" и еще какие-то практики. Перебором обычно не проверяют, проверяют крайние и выборочные значения.
Кроме того, программы не пишут на vbscript - это просто для каких-то вспомогательных вещей язык. А у серьезных систем разработки существуют и достаточно мощные средства тестирования, и достаточно хорошие практики, и например, статический анализ.
Я думаю, что твоя ошибка довольно банальна, типа переполнения вкупе с On error resume next или что-то такое. Для отлова такой ошибки не нужно проверять все возможные варианты, достаточно проверить крайние. Вообще, зацикливание - достаточно редкая ошибка для опытного программиста, чтобы можно было о ней всерьез говорить.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061241
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переполнения там точно не может быть, т.к. она остановится с ошибкой. В данном случае модульное тестирование как раз-таки в пролете я так думаю. Изначально был скрипт, который просто строил заданную последовательность на основании вводных данных. Все работало. А потом я решил обращаться к этому коду через цикл, чтобы получить ответ какие из последовательностей удовлетворяют заданным условиям. Я уже писал, что не программер, а любитель. Изучать какой-нибудь паскаль желания особого нет, тем более что большинство моих вопросов можно решить и на vbs. Вопрос в том, что один код у меня выполнялся больше недели. Но в тот раз я точно знал, что там ошибок быть не может. И таки дождался завершения. А в других случаях, я могу не быть уверенным, что какая-нибудь байда не приключится и соответственно даже не буду знать работает она или уже нет.)) Конечно можно писать лог, в который записывать вообще каждый переход программы к следующей операции.. не знаю, может быть это и вариант, но тоже как-то не очень. В общем не знаю, спасибко.. ))
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061254
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Древний анекдот, но как-то ложится в тему

Пьяный мужик что-то ищет под фонарем. Тут к нему под ходит милиционер и
спрашивает: "Что вы тут делаете?" Мужик отвечает: "Ключи от квартиры
ищу". "А где потерял?". "В парке". "А зачем здесь ищешь?".
"А здесь светлее ".
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061259
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Ну да.)) Все правильно.. а у кого я еще должен спрашивать? На самом деле может быть много странного.. ну я надеюсь, что не в vbs. А так бог его знает че там происходит.. оно может своей жизнью жить. А виноват в этом двоичный код и пакости вроде IEEE754.

Сейчас ищу проблемное место. Постепенно суживаю область.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061261
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
а у кого я еще должен спрашивать?
так ты спрашивай, тогда ответ получишь. А нет вопроса - нет и ответа.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061264
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Основная моя проблема вот в чем... у меня не выходит рассчитать время выполнения. Пока мои попытки были безуспешны.. почему-то так происходит, что на первый взгляд зависимость должна быть просто линейной (в другом скрипте), но почему-то это не так.. происходит сильная деградация. Я пытался по первой минуте рассчитывать (типа сколько надо сделать, а сколько сделано за минуту), но результат оказался в 27 раз меньше реально затрачиваемого времени. Вот наверное реальная проблема для меня. То, что я не вижу там нелинейной зависимости и не могу производить более точный расчет времени.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061267
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. я хочу сказать, что возможно у меня нет ошибки.. я просто не могу дождаться, потому что мне кажется, что при если при d=40 пролетает относительно быстро, то и и при d=252 будет как-то так. Я просто вчера ждал час и эта ерунда так и не перешла к следующей позиции, хотя при d=40 она за 1,5 минуты выполнялась. Я поэтому и решил, что наверное в коде какая-то ошибка. Но я только сейчас вспомнил, что там есть одна особенность из-за чего может быть действительно все долго. Блин.(
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061268
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А точно этот код нельзя запустить в VBA вместо VBS? Поставить там debug.print для переменной x и все сразу будет наглядно
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061271
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как у вас три вложенных цикла, то, по порядку, число выполнений 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 обязан понимать.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061273
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Думаю, без проблем можно. Точно, это же можно в экселе? Ну чтобы visual studio не ставить? Я вот тут не очень разбираюсь. У меня есть еще pascal.abc net но я его пока не осваивал. Думал там можно просто как-нибудь интерфейсы делать, но оказалось все плохо. Я вообще не понимаю, почему до сих пор нет нормальных шаблонов виндовых интерфейсов с готовыми кодами, типа вот кнопка "Открыть", вот "сохранить" и т.д. Все же программы они в принципе стандартизированы. У всех есть настройки, опции, какие-то общие часто встрчающиеся вещи. Но не.. все какое-то кривое пипец. В том же экселе вроде более-менее сделано, но дальше то никуда..(
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061274
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

пардон, соврамши число вызовов = d^3/4 - d^2/2
для d = 40 k = 15680, время = t
для d = 252 k = 3988051 время= 251*t

порядка роста это не меняет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061275
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

boobyПри условии, что время работы N2 не зависит от "номера вызова"
ладно пусть так будет.

Там есть зависимость. Но ее проследить невозможно вообще.
Т.е. время выполнения конкретного варианта вычислить нельзя. Как я не пытался.

Если точнее, то она должна перебрать больше 2 млн. вариантов. С этим проблем нет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061279
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

главное состоит в том, что во втором случае число вызовов N2 в 251 раз больше, чем в первом.
Это значит, что программа во втором случае должна работать как минимум в 251 раз дольше, если только работа N2 стабильно не ускоряется, волшебным образом, с увеличением значения d, да так, чтобы кубический рост числа вызовов оказался скомпенсированным.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061282
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
Точно, это же можно в экселе?
обычно да
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061283
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Я согласен. О моей проблеме времени выполнения я писал про корневой если так можно выразиться скрипт, похожий на тот, который работает сейчас как N2 к которому я обращаюсь в цикле, только чуть сложнее. Там ты просто задаешь конкретные условия, перебора нет. Никаких вариантов (как с циклом) там нет. Однако, вот именно там и не получается (пока) разобраться с временем выполнения. Именно там процесс сильно деградирует, а почему неясно. Причем первые (не помню уже, 3 вроде) минуты выполнения делают 25% от всей так сказать длины. Но видимо длина (или сумма) на которую я ориентировался, здесь не помощник. Я пытаюсь найти другую "опору", но найти универсальную математическую формулу для расчета пока никак. В части случаев формула правильная, в других нет. Хотя там уже значения ближе и может быть, когда я буду опираться на них, то расчет времени станет точнее, но и здесь пока нет никакой в этом уверенности. Возможно, если бы я был математиком, то смог бы найти формулу, но не факт. Потому что один математик вроде попытался, но ни к чему не пришел. А я пока продолжаю искать, но уже другими методами.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061285
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

Я пока пробую сузить область (если там все же ошибка). Но все больше склоняюсь, что просто оно так долго. Действительно, раньше у меня было 6500 вариантов, а теперь больше 2 млн. Блин. Я изначально думал, выставить d = 1000. А так ведь можно и не дожить.)) Я только сейчас стал осознавать насколько это может быть долгим. И даже не в 300 раз. Хотя посмотрим, если 1,5 - 6500, то 2 млн. - 7,5 часов. Потом, когда буду делать 1000 если решу все-таки, то буду запускать эту хрень на серваке. Благо, есть где можно без проблем держать процесс неделю.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061287
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя все равно все очень странно. Потому что последнее, что она записывает это когда x=3, y=10, z=14 т.е. все что ДО выполняется быстро (в пределах 2 минут) несмотря на d=252!, а все что ПОСЛЕ оооочень долго. Но при этом msg на 3,100 она все-таки выдала спустя ... 40 минут.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061288
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
для того, чтобы провести замеры и оценить характер зависимости времени обработки следующего отрезка той же длины,
математиком быть не требуется.

Вы рассказываете о том, что что у вас нелинейная зависимость "скорости продвижения" от позиции "ползунка".
это значит, что на каждом следующем шаге работы выполняется не просто больше действий, чем на предыдущем, а нелинейно больше.

Для грубой оценки времени точные формулы не нужны.
при квадратичной зависимости следующие 25% процентов потребуют в 4 раза большего времени, а при кубической - в 8 раз большего.
Если, например, окажется, что зависимость кубическая, то после обработки первых 25% вы, за то же время, за которое обработались первые 25% получите в восемь раз меньшую длину продвижения - то есть, около 3.5%., а при квадратичной в 4 раза меньшую - около 6%.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061292
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ох ты ж...)) Во она понаписала.) Все-таки похоже код работает. Она перевалила отметку из-за которой я решил, что с кодом проблема. Просто тупо не дождался. Процесс идет себе дальше и пишет результаты. Вот только комп надо выключать и ложиться спать. Так что в следующий раз видимо буду колбасить его. Там вся фигня в том, что она пишет в файл, только то, что удовлетворяет заданным критериям, а в некотором диапазоне от 3,10,14 она ничего не находит, потому ничего в файл и не пишет. Вот так бывает. Сам себя обманул. Думал, что ошибка какая-то. Но такое тоже бывает вообще. Непредвиденное.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061293
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Вопрос в том, что непонятно откуда нелинейность там берется. Там нелинейности нет. Там тупо сделать это, сделать то, перейти к следующему и т.п. Там нет перебора значений или чего-то пододного. Откуда она, эта нелинейность выполнения, если кол-во операций над каждым объектом одинаковое???
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061294
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из того, что вы сообщаете по числам, выглядит так, ч то у вас "зависимость от d", вероятно выше, чем d^3, может быть даже d^5.
Совсем плохо может оказываться, когда временные зависимости выше фиксированной степени d, что нибудь сорта d^d.
...
Что-то про свои алгоритмы в частности, и алгоритмы вообще, полезно знать.

Почитайте любую книжку по алгоритмам для начинающих .
В фундаментальные книги, вроде Кнута, не залезайте.
Они и сильно-сильно не для начинающих, и даже вообще не для чтения, практически.
Их главная задача - стоять на полке. Вам пока этого не нужно.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061295
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Вопрос в том, что непонятно откуда нелинейность там берется. Там нелинейности нет. Там тупо сделать это, сделать то, перейти к следующему и т.п. Там нет перебора значений или чего-то пододного. Откуда она, эта нелинейность выполнения, если кол-во операций над каждым объектом одинаковое???


стоп-стоп.
Прежде всего, вы должны довести себя до состояния, когда глядя на пример
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
For x = 1 To d - 2
  For y = x + 1 To d - 1
    For z = y + 1 To d
    'Здесь идет вызов другой функции, которая собственно и делает то, что требуется
    Call N2(...)
    Next
  Next
Next


вы на автомате говорите: "О! Это кубическая зависимость времени выполнения от d"

Потом уже можно начинать разбираться с тем кодом, завершения которого вы сейчас ожидаете.
(Не видя его, ничего сказать нельзя.)

Это правда, что не для всякого кода вообще выводятся точные формулы.
Но приближенные оценки можно получить в большинстве случаев.
И, экспериментальный подход, не видя кода, просто методом систематических замеров,
тоже позволит получить вам оценку, характер зависимости времени выполнения от размера задачи.
Для решения вопроса о том, на сколько дней можно уходить спать, этого должно быть достаточно.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061296
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Это разные вещи. Тот скрипт, в котором происходит сильная деградация - там в общем нет вызовов из цикла и никакого d= там нет. Там значения задаются вручную, а затем программа работает по опр.алгоритму и выдает результат. Т.е. грубо говоря если на входе у нас 3 значения, то и обрабатываем мы все время 3 значения. Это константа. И над каждым производим какие-то действия, пусть 100 операций - тоже константа. Там неоткуда браться нелинейности выполнения. Кроме разве того, что я опираюсь не совсем на ту величину при расчете этого времени. Но чтобы мне ориентироваться на величину, которая вероятно (только вероятно) более точна эту величину нужно сначала вычислить - и вот для этого как раз нужна формула, которой пока нет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061297
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Это не тот скрипт и другой код. Там такого нет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061301
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

в том, что вы сейчас пишите - нет смысла.

Как вы не видели, почему время выполнения вашего исходного примера кода, которого нет, нелинейно зависит от d,
(в конкретном случае - зависимость кубическая.)
так и любая из операций, время выполнения которых вы оцениваете как константу, может оказаться нелинейно зависящей от "размера задачи".
Например, именно такой особенностью обладает работа со строками.
Время склейки двух строк в одну нелинейно зависит от размера склеиваемых строк.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061411
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

boobyВремя склейки двух строк в одну нелинейно зависит от размера склеиваемых строк.

Не задумывался. Но хотелось бы тогда пояснения - почему? И где узкое место? Неужто склейка двух строк такая трудоемкая операция? Если рассуждать логически - (если я правильно понимаю логику в принципе), то строка А (это набор памяти от адреса n1 до адреса n2), а строка Б - ну соответственно понятно о чем я. Элементарно. Но вот работает ли оперативка именно так при (например) изменении, увеличении строки в цикле или она пишет куда придется, беспорядочно, тогда да.. будет нелинейно как деградация о которой я говорил ранее. Объясните плиз..
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061413
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Не очень я врубаюсь какая нелинейная зависимость там. Даже с d. И что? Просто посчитать кол-во вариантов заранее и крутить счетчик.

Кстати, если уж пошла такая песня.. не сочтите за.. 1) кто-нибудь пробовал написать строковый калькулятор на vba или vbs? 2) это вообще возможно? 3) если тебе надо 100 тыс. знаков после запятой, то это только pascal и все делать через извраты с R.TryParse(s,res) или как? Значимых цифр у double там, как и у всех 15-16.

Буду признателен за разъяснение.)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061417
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Не очень я врубаюсь какая нелинейная зависимость там. Даже с d. И что?...

вы вообще, о том, что такое "линейная зависимость" представление имеете?
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061419
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

По вашим словам нет.) Касаемо цикла и d: я могу хоть 50 циклов накрутить и все равно это для меня будет линейным, потому что я знаю сколько раз эти вложенные циклы вызовут основную процедуру. Сами "For" я в расчет не беру, что надо? Вы так пишете, будто цикл - это лошадь на забеге.)) Бежит резво пока силы есть, а потом с каждым витком все медленнее и медленнее, пока не сдохнет.)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061420
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

По вашим словам нет.) Касаемо цикла и d: я могу хоть 50 циклов накрутить и все равно это для меня будет линейным...

Вы зря улыбаетесь. Вы несомненно не понимаете, о чём пытаетесь рассуждать.
"линейная зависимость", это когда на любые равные изменения счетчика, количество вычислений изменяется на одну и ту же величину.

Возьмем ваш пример и перепишем так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
For x = 1 To d
    'Здесь идет вызов другой функции, которая собственно и делает то, что требуется
    Call N2(...)
    Call N2(...)
    Call N2(...)
    Call N2(...)
    Call N2(...)
Next


В таком примере зависимость между изменением значения 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.
For x = 1 To d
  For y = 1 To d
    'Здесь идет вызов другой функции, которая собственно и делает то, что требуется
    Call N2(...)
  Next
Next


Пусть 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 по порядку величины.

По поводу "все равно" или "не все равно".
Да любой вложенный цикл с произвольным числом уровней вложений можно представлять себе "просто как одноуровневый цикл".
И в этом смысле, можно себе видеть, что они "все линейны".
Но в реальности, надо понимать, что такое представление сходится с вышеизложенными соображениями только с учетом нелинейного, скачкообразного изменения верхнего предела индекса при попытке изменения "размера задачи".

В общем - не забивайте себе голову, если сами писать не планируете.
Просто стребуйте с писателя характеристики времени счета от размера задачи, чтобы приблизительно представлять время ожидания.
Ну, или постройте их себе сами экспериментальным путем.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061424
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
еще "вчера" надо было счетчик поставить внутрь 3-х этажей и прогнать не функцию а счетчик.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061476
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Это все было понятно с самого начала.)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061478
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Это все было понятно с самого начала.)

Правильно ли я вас понял, что в вашем вопросе с самого начала не было смысла, и вы заранее знали на него ответ?
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061479
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ustinov,

Да, я малость ступил, забыв посмотреть сколько будет вызовов. Уже давно все посчитал, вместе с доп.условиями там выходит > 2 млн. вызовов. Короче, 6500 вызовов она прошла за 1.5 мин., если посчитать пропорционально, то программа должна была бы работать ~ 9.5 часов.

Однако, этого там не происходит. И проблема не в кол-ве вызовов, а в самой процедуре. Но там уже время выполнения вычислить нереально. В реальности за 15 часов она дошла лишь до 33 из 252. Можно было бы конечно распараллелить задачу, но меня не устраивает тогда нагрузка на процессор. Так что либо буду останавливать и делать частями, либо пусть так работает. Видимо, понадобится пара недель.

Лучше поделитесь, пробовал ли кто-то написать строковый калькулятор, ну хотя бы какую-то операцию, например деление.))
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061481
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Нет. Хотя, вопрос был и правда тупой. Неудачно сложились звезды.)) Я просто думал, что в скрипте ошибка и он ушел в бесконечный цикл. Я сделал три ошибки: 1. забыл посчитать кол-во вызовов 2. забыл, что она пишет только удовлетворяющее заданным критериям и не подумал, что могут быть "провалы", где целые диапазоны "молчат" 3. не знал, что потребление оперативки там может оставаться неизменным в течении большого периода времени.
Смесь этих факторов заставила меня усомниться в правильности кода, хотя все было так как должно.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061491
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если бы с самого начала разговаривали в терминах своей реальной задачи и показывали код, было бы яснее, можно ли,
и что именно, сделать для общего ускорения/понижения степени зависимости от "размера задачи".
У меня сохраняется подозрение, что ваша N2 имеет свою степень такой зависимости выше 1.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061533
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Вы так и не объяснили, что не так со склейкой строк... и какая там зависимость?
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061543
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Вы так и не объяснили, что не так со склейкой строк... и какая там зависимость?

Зачем вам это?

Все хорошо со строками.
Если длина склеиваемых строк зависит от d, то просто, при неумелом использовании склейки, добавится еще та степень к зависимости
времени выполнения от d, в какой в среднем растут склеиваемые строки в зависимости от d.

Когда степень превышает 2, очень быстро становится неинтересно, какая она на самом деле - 3 или 5 или 8.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061551
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Что будет быстрее писать в цикле:
строку "str = str & ...", динамический массив "arr(n) =" или скидывать/добавлять значения в файл "f.Write(...)" ?

Естественно речь идет о десятках миллионов символов и больше... а массив соответственно с UBound больше млн.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061570
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Что будет быстрее писать в цикле:
строку "str = str & ...", динамический массив "arr(n) =" или скидывать/добавлять значения в файл "f.Write(...)" ?

Естественно речь идет о десятках миллионов символов и больше... а массив соответственно с UBound больше млн.

это слишком абстрактная постановка вопроса.
Может быть - какая-то комбинация из перечисленного.

про сложение строк - поищите, на форуме или рядом, в районе 2003-2005 годов должно найтись много разных быстрострокодобавляторов.
Какие-то из них должны легко переноситься на vbs, какие-то нет.

как вариант:
https://www.sql.ru/forum/73509/optimizaciya-raboty-so-strokami

Из того, что вы пишете (интересуетесь парсингом) может оказаться, что вам не быстрострокодобавлятор нужен, а всего лишь специализированная коллекция реализующая стек, с линейным (или близким к линейному) в среднем временем работы.

И да, к совету про перенос работы в Excel, пожалуй, присоединюсь.
Как минимум, вы получите другой уровень отладки.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061763
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Спасибки.) Excel не нравится отсутствием автономности. Из скрипта можно легко сделать exe. А для vba еще надо искать компилятор. Может дорасту до паскаля. В этом вероятно и то больше смысла для перехода. Но пока лень его изучать. Или все-таки поставлю visual studio. Если там будет не заморочно с формами работать, то это будет самый лучший вариант. В паскале я попробовал и... ничего не понял. Чтобы стандартное меню сделать можно головой о стену убиться, элементарный файл браузинг так вообще нечто непонятнокакделающееся.))

Сравнил у себя строку и массив. Строка выполнилась за 22 мин. А массив за 31. Может быть из-за ReDim. Кстати опцию Preserve не добавлял.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061776
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл сказать, что это без оптимизации (по ссылкам). Просто переделал как было на массив и сравнил производительность.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061829
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

Короче, по ссылкам, я так понял нужно создать собственный класс, обратиться к какой-то dll-ке (толком не понял к какой, то ли к kernel32, то ли к oleaut32) и затем ЭТО как-то использовать для конкатенации своей строки.. которая у меня в цикле растет, т.к. к ней добавляются все новые значения.

ИЛИ можно пытаться контролировать ее рост... это видимо нужно проверять. Много средних строк, которые придется складывать в конце VS одной длинной, к которой добавляются короткие значения.

Много рассуждений про короткие и длинные строки. Но по факту сначала строка короткая, а потом она длинная. Особенно доставило это, цитирую: "Короткие строки (по возможности) выделяются из внутреннего кеша в 64К, размещаемого в недрах OleAut32.dll"

64K? Серьезно? И как оно может помочь, когда строка уже длинная? Я наверное чего-то не понимаю...
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061836
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди! Я не верю собственным глазам! Короче, я вчера экспериментировал с массивом, вместо конкатенации строки. В ходе цикла нужно было менять размер массива по ходу добавления новых значений. Я написал ReDim без задней мысли. Померил результат: строка - 22 минуты, массив 31 минута. Вспомнив о Preserve вставил ее в цикл и... результат 82 секунды!

Там правда что-то я малость напортачил + появилась еще другая проблема. Раньше когда я писал строку, мне нужно было запоминать позицию в строке для добавления потом определенных вещей. Как сделать это теперь, когда каждое новое значение пишется в массив?..

Но с производительностью возможно вопрос решился. Весьма неожиданно. В других скриптах я когда добавлял Preserve это никогда ничего по сути не меняло, а сейчас.. Я в шоке.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061838
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
...Я в шоке.

Примерно полтора порядка у вас еще остаётся в запасе на разного рода эксперименты, это можно сказать наверняка.
Но психологического эффекта такой силы вы, конечно, уже не получите.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061842
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
booby,

А что такого делает Preserve в данном случае? Индексирует содержимое как-то по-своему или каким-то особым образом работает с оперативой? Везде пишут, что опция просто типа что-то там сохраняет.. никогда не замечал какого-то влияния.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061845
Eolt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

Спасибки.) Excel не нравится отсутствием автономности. Из скрипта можно легко сделать exe. А для vba еще надо искать компилятор. .


Для VBScript не существует компиляторов, EXE который делается из скрипта просто сжимает и шифрует исходник, который перед исполнением распаковывается. Никакой дополнительной автономности такой EXE не дает. Если на машине отключен Windows Script Host (почти на всех офисных пк это делается административной политикой для безопасности) такой экзешник там работать не будет.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061851
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
booby,

А что такого делает Preserve в данном случае? ...

Вы себя вообще нормальным человеком считаете?
В каком таком "данном", если вы никакого случая не дали?

Если про "вообще" - то "вообще" он может заметать под ковер особенности кода произвольно низкого качества,
до каких-то пределов, и при условии наличия большого количества непрерывной свободной памяти непосредственно
за пределами уже размещенного массива.

Ну, в размерах десятков килобайт на массив - почти несомненно, возможно даже до приличного количества мегабайт, если повезет.
Говоря сильно грубо, он позволяет при работе с массивом использовать "экономные" подходы к выделению памяти,
отдалённо того же рода, которые используются при работе с "короткими строками", которые вы упоминали.
А про его содержательное назначение прилично было бы и в справке почитать, хотя бы по vba.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061866
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
Спасибки.) Excel не нравится отсутствием автономности
а причем тут? речь шла только про удобную отладку в IDE. Потом можно засунуть это обратно в vbs
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061877
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята, че вы так накинулись то? Втроем на одного?)) Отвечаю всем по-порядку:

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! Признаюсь честно, я не умею этим дебаггером пользоваться, но я и не пробовал толком. Давно это было. Когда я пробовал написать строковый калькулятор для деления чисел. У меня там какая-то ошибка, мне показалось очень запарным ее искать (в т.ч. по причине большого кол-ва символов) и я на этот код забил. Хотя сам код абсолютно простой.
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40061943
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77,

Если Вам ехать а не шашечки - но через VBA
пришлите на
sia.enters@inbox.lv

мы ускоряем всякие хотелки на два порядка и даем инстрУмент людЯм
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40062262
user-77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MX-9,

Вы про калькулятор или про вообще?)
...
Рейтинг: 0 / 0
Вопрос к программерам
    #40062290
MX-9
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
user-77
MX-9,

Вы про калькулятор или про вообще?)


Сразу при включении автоматически ексцель отображается вна сервер.
Там он крутится резво. Там все то же - листы - ячейки..
Оба ексцеля синхронизированы в обе стороны.
Кулкулатор - и тоже всегда пожалуйста.
Скиньте мне тестик на VBA - погоняю на скорость.
...
Рейтинг: 0 / 0
59 сообщений из 59, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]