powered by simpleCommunicator - 2.0.36     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
25 сообщений из 59, страница 2 из 3
Вопрос к программерам
    #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
25 сообщений из 59, страница 2 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вопрос к программерам
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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