
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
09.02.2004, 12:40:51
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
г-да Программеры! Помогите решить такую проблему Возникает необходимость конкатенации строк в цикле примерно так Код: plaintext 1. 2. 3. Это работает ровно 30 секунд... Нельзя ли как-нибудь ускорить сей процесс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 12:59:36
|
|||
|---|---|---|---|
|
|||
Оптимизация работы со строками |
|||
|
#18+
Может проблема в GetID? Код Код: plaintext 1. 2. выполняется за треть секунды ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 13:13:38
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
To boevik А какая у Вас машина? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 13:15:38
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
To boevik И заодно попробуйте вот так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 13:30:24
|
|||
|---|---|---|---|
|
|||
Оптимизация работы со строками |
|||
|
#18+
Была у меня проблема с конкатенацией. Начинает тормазить когда размер переходит 70000 символов. Цифра установлена эксперементально. Выход, разбить на несколько длинных строк. Конкатенация двух длинных строк происходит мгновенно (мгновенно - в переделах разумного) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 13:57:32
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
К сожалению, я не могу разбить эту операцию на конкатенацию длинных строк, т.к. необходимо накапливать в переменной значения, выбираемые с помощью процедуры в цикле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 14:25:11
|
|||
|---|---|---|---|
|
|||
Оптимизация работы со строками |
|||
|
#18+
Никогда не говори никогда. Можно накапливать в разные строки и потом их объеденять. К примеру код: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Очень интересно поэксперементировать с длинной буфера. Время изменяется от 2 секунд при длине 10,000 символов до 1.5 минуты при длине 100,000. (А что бы все загнало в одну строку, так результата не дождался даже после нескольких минут ожидания) Выводы напрашиваются сами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 15:05:18
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
Код: plaintext 1. 2. а как объявлена функция GetID ? и изменяется ли в этой функции значение входного параметра str? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 15:13:45
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
to Hibernate вообще-то должно быть GetID(i) :). Но дело тут не в функции, т.к. я ее вызов заменял на " & "авава"" - результат тот же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
09.02.2004, 15:15:31
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
To boevik Предложение очень интересное. Пошел пробовать. Спасибо, boevik. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.02.2004, 11:38:41
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
Перед началом конкатенации попробуй загнать в "накопляющую" строку ожидаемое максимальное количество символов, тем самым выделив единожды под нее память, а не каждый раз при очередной канкатенации. Затем загони в нее самое начало строки и уже в цикле добавляй прочие "куски". Сейчас попробовать не могу, но исходя из теории прирост в производительности должен почувствоваться... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
10.02.2004, 11:40:12
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
Да, и еще вместо конкатенации (&) попробуй выполнять сложение (+). Это сработает и тоже даст прирост производительности в случае если будешь складывать строки со строками... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
11.02.2004, 11:31:20
|
|||
|---|---|---|---|
|
|||
Оптимизация работы со строками |
|||
|
#18+
в продолжении Нуф-Нуфа если работать с большой, заранее сформированнной, строкой с помощью оператора MID (не путать с функцией MID) - то рост производительности м.б. в разы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.02.2004, 16:47:40
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
Если не давать VB самому работать со строками время уменьшается с 3.9 сек до 0.08 сек Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.06.2005, 17:41:29
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
marvanВариант 2 выполняется за 0.08 сек А можно это оформить в виде функции? А то у меня вместо нужной строки хрень какая-то получается. Типа так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
16.06.2005, 23:41:47
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
Antonariy marvanВариант 2 выполняется за 0.08 сек А можно это оформить в виде функции? А то у меня вместо нужной строки хрень какая-то получается. Типа так: Код: plaintext 1. 2. 3. "Это" (конкатенацию пары строк) практически абсолютно бессмысленно оформлять в виде функции. (Если у тебя проблема с конкретным кодом - лучше опиши, в чем она, чем тратить время на такую функцию.) Написать функцию эффективней того, что ты сам только что написал почти нелья. Почти в том смысле, что в pCod-e любая функция будет заведомо давать проигрыш по сравнению с инлайн-соединением, в компилированном коде "могут быть варианты", но они заведомо не стоят по достигнутому результату приложенных услий, и абсолютно не оправдают ожиданий. Причины этого будут изложены ниже. "Это" (циклические соединения строк) чаще принято оформлять в виде классов, набирающих строки и отдающих их "за раз". Самая короткая, простая, но достаточно эффективная и красивая своей краткостью реализация из тех, что доводилось видеть - принадлежит Андрею Митину: http://am.rusimport.ru/MsAccess/topic.aspx?ID=261 вот тут чуть сложнее http://www.vbaccelerator.com/home/VB/Code/Techniques/StringBuilder/String_Builder_Class_and_Demonstration_zip_cStringBuilder_cls.asp Вообще, если полазить по интернету, то с пяток относительно различных реализаций для VB4|5|6 наберется. Все они (как и приведенный 12 фев 04, 16:47 код от marvan ) так или иначе используют одни и те же принципы работы со строками, понимание которых складывается примерно таким набором: - сложение (очень) коротких строк происходит весьма быстро и, если речь идет о сложении всего нескольких (очень) коротких строк - не о чем заморачиваться и некого обгонять. ("Длинное" и "короткое" чуть ниже слегка, но не полностью уточнится). - если складывается несколько "коротких" строк с одной достаточно "длинной", то (обычно) быстрее сложить сначала несколько коротких, а потом добавить результат к оставшейся длинной - (правильно расставить скобки в выражении). - сложение длинных строк - тут не подберешь правильного сравнения - нелинейно много дороже сложения коротких. При определенных условиях разница становится катастрофической - система как бы "замирает" на этапе выделения (очень) длинной строки. Для VB/VBA выделение строк (как и для всех остальных "потребителей в системе", обращающихся к COM за получением строк) производят функции из OleAut32.dll. В отношении строк - это общесистемное узкое горло. В многозадачном окружении запросы на памать для строк COM отрабатывает последовательно. (Это значит, что если есть несколько VB-Like приложений, очень активно работающих со строками, то они, являсь прямыми конкурентами за общий, но последовательно раздаваемый ресурс, только по одной этой причине вместе отработают гарантированно за большее время (простаивая в очереди на обслуживание), чем сумма времен их "монопольной работы".) Строки - это в целом дорого. (Впрочем, как и динамические массивы). Длинные строки выделяются из общесистемной кучи. В нагруженной "активно-строковой" ситуации, при интенсивном обращении за новыми (все более длинными) строками (и не освобождении ранее занятой памяти) "строковое пространство" (может) быстро дефрагментируется и все заканчивается сообщением об ошибке - "память для строк исчерпана. Каюк." (И, чем ближе к этому "каюк", тем медленней начинает отзыватся система, аккуратно выискивая - есть ли у нее еще или уже нет, возможность выполнить запрос на выделение памяти. Особенно, когда строко-пожирательных задач в системе оказывается "много".) Короткие строки (по возможности) выделяются из внутреннего кеша в 64К, размещаемого в недрах OleAut32.dll. Если там еще осталось место, не занятое другими короткими строками и строки-операнды "уже там", а строка результат способна разместиться в этом оставшемся месте в виде непрерывного диапазона - значит вам настало шчастье и опреация сложения строк выполнится так быстро, как это вообще возможно в COM. Такое сложение "самооптимально" и по скорости его по существу - "нельзя улучшить". Из всего вышесказанного выводятся следующие самые общие рекомендации по работе со строками. - myStr = vbNullString - это вполне приличный тон, когда вам больше не нужно ранее заказанное строковое пространство. На мой взгляд, для коротких это в целом важнее, чем для длинных. - За выделением длинных строк следует обращаться настолько редко, насколько это вообще возможно по смыслу конкретной задачи и/или универсальности применения разрабатываемого класса (или функции, содержащей в себе цикл накопления строки). Стандартный способ - запросить (строку) с большим или меньшим запасом и потом "вписывать в запрошенное", а не "складывать". В целом эта техника и обсуждалась ранее в данном потоке. Чем реже обращения, тем быстрее не только ваш алгоритм, но, по ходу дела, еще и общая лохматость, пардон, "строковая мультизадачность" повысится. Несколько другая техника может быть сформулирована так - складывай короткое образовывая среднее (часто). Складывай среднее среднее, образовываяч длинное. Длинное старайся не складывать, а если придется - то длинное складывай с длинным. В таких техниках очень эффективно использование функции Join. Похоже, она инспектирует свой массив на длины складываемых строк, выделяет память для строки-результата за одно обращение и копирует в результирущую строку строки, составляющие переданный Join массив. ЗЫ за многословие - извинения с выражением. Но зато нажмакался. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.06.2005, 08:48:19
|
|||
|---|---|---|---|
Оптимизация работы со строками |
|||
|
#18+
вот чем я пользуюсь: Код: plaintext 1. - это быстро - это удобно использовать - это не содержит опасных API вызовов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=60&tablet=1&tid=2167612]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
47ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 205ms |
| total: | 327ms |

| 0 / 0 |
