|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Up. Несколько изменил условия тестов: UDF стала обычной пустышкой: Код: pascal 1. 2. 3. 4. 5. 6. 7.
Объявление параметра UDF максимальной длины: Код: plsql 1. 2. 3. 4. 5.
Параметр хранимой процедуры тоже максимальной длины: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В клиентском приложении все без изменений (s имеет тип AnsiString): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
Тесты проводились с контролем длины передаваемого параметра 32750 и 4080 символов. Напомню, что каждый тест проводился троекратно. После каждого проведения база пересоздавалась из скрипта. В первой серии тестов в хранимой процедуре производился вызов UDF DUMMY_INT. Во второй серии тестов вызов UDF был отключен: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вот что получилось: Длина параметра: 32750 Вызов SP с вызовом UDF: 08.56 сек Вызов SP без вызова UDF: 08.55 сек Длина параметра: 4080 Вызов SP с вызовом UDF: 01.25 сек Вызов SP без вызова UDF: 01.24 сек Видно, что наличие вызова UDF на время выполнения теста практически не влияет. Остается предположить, что в коде FB при передаче параметра типа VARCHAR реализован, как выразился Dimitry Sibiryakov, "stateless алгоритм и его сложность O(N^2/2)". Вот как-то так... С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 12:19 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesovif Length( s ) > 32750 then Тесты проводились с контролем длины передаваемого параметра 32750 и 4080 символов. ? надеюсь, для теста 4080 символов это условие менялось в коде? я бы вам советовал провести тест с длиной 7к и 9к, т.е. когда одно значение влезает в один пакет tcp, и не влезает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 12:32 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, как измерялось время ? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 13:01 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
kdv? надеюсь, для теста 4080 символов это условие менялось в коде? Да, в коде клиентского приложения. kdvя бы вам советовал провести тест с длиной 7к и 9к, т.е. когда одно значение влезает в один пакет tcp, и не влезает. Длина параметра: 7000 Вызов SP без вызова UDF: 1.95 сек Длина параметра: 9000 Вызов SP без вызова UDF: 2.46 сек ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 14:56 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
hvladкак измерялось время ? В коде клиентского приложения: Код: pascal 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.
Время осреднялось по результатам трех тестов. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 14:59 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, т.е. все расходы на стороне клиента - в общую кучу. Так и надо, ага. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 16:55 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
hvlad Думаю, следует исходить из того, что сумма всех расходов на клиенте в неком приближении есть величина постоянная. По крайней мере, не отличается в 7 раз в зависимости от длины передаваемого параметра. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 17:44 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
PolesovДумаю, следует исходить из того, что сумма всех расходов на клиенте в неком приближении есть величина постоянная.С чего бы это ? Ровно то же самое можно сказать о сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 18:13 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
hvlad В каждом тесте выполняется цикл Код: pascal 1.
На каждую итерацию цикла в строке накапливается псевдослучайные значения, разделенные тильдой Код: pascal 1.
При превышении длины строки некого константного значения Код: pascal 1.
Передается строковый парамер, вызывается хранимая процедура и строке присваивается значение '' Код: pascal 1. 2. 3.
И где здесь может быть разница в 7 раз при изменении константного значения сравнения с 32750 до 4080? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 18:30 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, Из-за "безразмерных" стрингов в дельфи работа с оными иногда может преподносить сюрпризы в плане скорости или потребления памяти. Я бы тест переделал. Хотя бы для того, чтобы не гадать попусту. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 19:06 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
PolesovНа каждую итерацию цикла в строке накапливается псевдослучайные значения, разделенные тильдой ... Передается строковый парамер, вызывается хранимая процедура и строке присваивается значение '' .. И где здесь может быть разница в 7 раз при изменении константного значения сравнения с 32750 до 4080? Например, в процитированных моментах. Вот здесь один умный человек пишет: Обычно, каждый раз, когда вы присваиваете одну строку другой, компилятору надо бы выделять память и копировать текст из одной переменной в другую. Поскольку строки в Delphi могут быть очень большими (теоретически до 2 Гб максимум в 32-х разрядных приложениях), это может быть весьма медленно. Резюмируя, - для категорических утверждений тест надо доработь. ИМХО. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 19:12 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
PolesovДлина параметра: 7000 Вызов SP без вызова UDF: 1.95 сек Длина параметра: 9000 Вызов SP без вызова UDF: 2.46 сек ну вот и результат на оверхед при +1 пакете. А с 32750 относительно 4080 получается разница в +3 пакета ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 21:00 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, я так понимаю, что ваши умозаключения сделаны по примеру копирования большого файла блоками - чем больше блок, тем быстрее копируется, и наоборот. Тут это так не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 21:01 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, можно попробовать в конфиге поменять TcpRemoteBufferSize = 8192 на 16384, и перепроверить тест с 7к и 9к. Ну и с 4 и 32. А потом проверить на 32768. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 21:04 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesov, хост локальный или удалённый? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 21:07 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
miwaonline, легче всего в текущей реализации теста отключить вызов SP и заменить на передачу полученного стринга через, ну, скажем, сокеты. На днях займусь этим. Впрочем, предлагайте методу - готов рассмотреть возможность переделки теста. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:30 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
miwaonline Ну, никаких категоричных утверждений с моей стороны не было. Есть желание разобраться. Я уже отписл - предлагайте методу проведения тестов, готов рассмотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:33 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
kdv, переделаю тест на передачу полученной строки через сокеты без вызова SP - там видно будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:38 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
kdvя так понимаю, что ваши умозаключения сделаны по примеру копирования большого файла блоками - чем больше блок, тем быстрее копируется, и наоборот. Нет, на основании тестирования некой UDF WordNum из библиотеки bz_func.dll ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:40 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
kdvPolesov, можно попробовать в конфиге поменять TcpRemoteBufferSize = 8192 на 16384, и перепроверить тест с 7к и 9к. Ну и с 4 и 32. А потом проверить на 32768. Хорошо, попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:40 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Симонов Денисхост локальный или удалённый? Пробовал и на локальном, и на удаленном - соотношения результатов примерно одинаковы. Последнюю серию тестов делал на localhost. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:42 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
kdvну вот и результат на оверхед при +1 пакете. А с 32750 относительно 4080 получается разница в +3 пакета Следуя этой версии, результаты для длины 9000 и 15000 должны быть примерно одинаковы. Так? Завтра проверю. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.10.2015, 22:46 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
Polesovmiwaonline Ну, никаких категоричных утверждений с моей стороны не было. Есть желание разобраться. Я уже отписл - предлагайте методу проведения тестов, готов рассмотреть. Вообще оптимальным считается воспроизведение бага средствами чистого isql. Так что я бы делал что-то типа такого (пример грубый, просто для общего представления): Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Тоесть генерировал файл с коммандами (чтобы вручную параметры с длинными строками не набивать) и потом измерял время выполнения test.sql. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2015, 11:16 |
|
Длинные варчары как парметры
|
|||
---|---|---|---|
#18+
miwaonlineТоесть генерировал файл с коммандами (чтобы вручную параметры с длинными строками не набивать) и потом измерял время выполнения test.sql. Так и сделал. Ну, что сказать - посыпаю голову пеплом. Для всех длин параметров время выполнения примерно одинаково. Для более длинных строк время немного меньше, видимо за счет уменьшения количества вызовов SP. В моих тестах основные потери по времени были при конкатенации строки параметров: Код: pascal 1.
При этом из kernel32 вызывается функция LStrCat. Вопрос можно считать закрытым. С уважением, Polesov. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.10.2015, 14:27 |
|
|
start [/forum/topic.php?fid=40&msg=39069890&tid=1562606]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
47ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
others: | 253ms |
total: | 406ms |
0 / 0 |