:: Visual Foxpro, Foxpro for DOS
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
Лулгу, заметь, тебя упомянули.
Кстати скажу чесно, .. не скажу. Лулгу нас не бросает ) Прикольный

Оцени в промежутке между своими стопками - сколько шороху своими циклами у них навожу.
Меряют что-то, измеряют.
На пользу - пусть изучают творчество lulgu, а то засиделись.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Ты слаб, лулну, в троллениии монстров. Троллит можно весело и восторженно, меня потрольь, БКшку, все поймут. )
Но торолль с знанием тематики рорлления... у ьеюя какая тематика?
Я ж говорю,тролли тоскоивые ) Как в мс, убогая конотороа. ХП не спрсил, ъто не принято.....



Исправлено 1 раз(а). Последнее : of63, 12.10.18 00:52
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc
Я сравнивал первый вариант от lulgu со своим (и, соответственно, 3-м вариантом Игоря) на произвольных данных, полученных таким образом:
...
то есть 100'000 записей, каждая из которых содержит 10 произвольных чисел в интервале от 1 до 999.

Результат был 100 секунд против 2-3 секунд.

А как конкретно ты сравнивал?
Надо видимо как-то привести к одному знаменателю собственно тестирование.
Чтобы можно было подставляя разные процедуры видеть более-менее результаты в более-менее однотипных условиях.

Например так:

***
* формирование образцового курсора для использования его данных в разных вариантах
***
PROCEDURE creacurs1
CREATE CURSOR cursMain (s C(40))
= RAND(-1)
FOR lni=1 TO 100000
cStr = ''
lnMax = 10 && INT(8*RAND()+3)
FOR lnj=1 TO lnMax
nRand = INT(900*RAND()+100) && INT(999*RAND()+1)
cStr = cStr + ',' + TRAN(nRand)
ENDFOR
IF lnMax=4
cStr = cStr + ',' + TRAN(nRand)
ENDIF
INSERT INTO curs1 VALUES(SUBSTR(cStr,2))
ENDFOR
RETURN
****

Ну и сама программа тестирования:

n = 1
creacurs1()
BROWSE LAST
DO CASE
CASE n=1
* работа с дублем образцового курсора
SELECT * FROM curs1 INTO CURSOR curs1
* тест 1
ss = SECONDS()
REPLACE s WITH myProc(s) ALL
? SECONDS()-ss
CASE n=2
* работа с дублем образцового курсора
SELECT * FROM curs1 INTO CURSOR curs1
* тест 2
ss = SECONDS()
*
? SECONDS()-ss
ENDCASE
BROWSE LAST
CANCEL

По предложению Тарана использовать массивы накидал такой свой вариант:

***
PROCEDURE myProc
LPARAMETERS ls
LOCAL lnN, lnMax, amas
lnMax = GETWORDCOUNT(ls,',')
DIMENSION amas(lnMax)
FOR lni=1 TO lnMax
amas[lni] = VAL(GETWORDNUM(ls,lni,', '))
ENDFOR
ASORT(amas)
ls = ''
lnN = amas[1]
FOR lni=1 TO lnMax
lnN = amas[lni]
IF lni=lnMax OR lnN<>amas[lni+1]
ls = ls + ',' + TRAN(amas[lni])
* ls = ls + TRAN(amas[lni]) + IIF(lni=lnMax,'',',') && на 0.2 сек. больше
ENDIF
ENDFOR
RETURN SUBSTR(ls,2)
*RETURN ls

Кстати проверил ради интереса, как влияет на время использование IIF для отсечения лишней последней запятой при наращивании. И использование SUBS.
Так оказалось, что способ с IIF (см.выше) по времени выходит больше.
[sm128]


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Сравнивал примерно так же, как и ты, но без оформления в функцию, на вызов которой тоже тратится определенное время, что немного "портит картинку".

Но ты напрасно трудился - практически твой вариант уже был здесь представлен ранее, только вместо функций GETWORD* для разбора строки использовалась ALINES()

Crispy
Так оказалось, что способ с IIF (см.выше) по времени выходит больше.
Естественно, ведь проще 1 раз отсечь символ, чем много раз проверять.
Но это зависит и от размерности массива - будь он покороче, результат мог быть и другим - все же одна такая проверка работает быстрее усечения строки.

Но если биться за доли секунды, то у тебя там ближе к концу есть две лишние строки:
lnN = amas[1] && вообще лишняя, на мой взгляд
lnN = amas[lni] && ненужное присвоение, достаточно просто использовать amas[lni]

Ну, и заменив TRAN() на ALLT(STR()), ты, думаю, выиграешь больше, чем 0.2 сек.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Crispy

Сообщений: 18571
Дата регистрации: 16.05.2005
akvvohinc

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


------------------
В действительности все иначе, чем на самом деле.
                                      (Антуан де Сент-Экзюпери)
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если стоит цель проверять именно функцию сортировки чисел в строке, то даже наличие курсора с тестовыми данными (тем более довольно массивного) уже вносит свои погрешности - по хорошему надо либо перетасовывать вызовы тестируемых функций (сначала v1 проверять, потом v2, но при следующем прогоне делать наоборот), или вообще не заморачиваться с курсором и тестированием 100к РАЗНЫХ строк, а тестировать всего десяток "показательных" вариантов такой строки - в простом цикле (да и тот нужен лишь потому что само по себе исполнение такого кода очень быстрое, и точно замерить время одного вызова практически невозможно).


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Crispy
В целом же - единообразие сравнения на равных условиях для разных вариантов все же как бы важнее собственно выигрышного оформления.

Я не это имел в виду:
допустим, "чистая" функция1 исполняется 0,0001 сек, а функция2 - 0,0002 сек, то есть разница - в 2 раза.
Но если к каждой из них добавить нечто, не имеющее к ним прямого отношения (у тебя это временнЫе затраты на вызов самих функций), то соотношение времен будет уже меньше 2. Это я и назвал "портится картинка".

Например, замерь время выполнения такого цикла (у меня 12 сек):
sec = SECONDS()
FOR i=1 TO 10^8
a = 1
ENDFOR
?SECONDS()-sec

А теперь оформи команду внутри цикла как функцию (у меня 48 сек):
sec = SECONDS()
FOR i=1 TO 10^8
= f1()
ENDFOR
?SECONDS()-sec
FUNCTION f1
a = 1

На что ушло более полуминуты?



Исправлено 1 раз(а). Последнее : akvvohinc, 13.10.18 00:03
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
В большинстве нетривиальных случаев доля накладных расходов на "просто вызов функции" будет пренебрежимо мала.
А вот доступ к курсору/таблице существенно влияет на тестирование функции - даже если прямо в SELECT эту UDF и прописать, не говоря уж про SCAN или REPLACE ALL ...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
akvvohinc

Сообщений: 4224
Откуда: Москва
Дата регистрации: 11.11.2008
Время, тратящееся на сам SCAN и REPLACE, можно измерить отдельно (например, запустив в цикле пустой SCAN лишь с REPLACE) и учесть в "результате соревнований".
Возможно, это будет и не совсем то же самое, что SCAN "с нагрузкой", но в целом, думаю, оценка "чистых" функций станет при этом точнее.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
pasha_usue

Сообщений: 3650
Откуда: Е-бург
Дата регистрации: 06.10.2006
akvvohinc
Время, тратящееся на сам SCAN и REPLACE, можно измерить отдельно (например, запустив в цикле пустой SCAN лишь с REPLACE) и учесть в "результате соревнований".
Возможно, это будет и не совсем то же самое, что SCAN "с нагрузкой", но в целом, думаю, оценка "чистых" функций станет при этом точнее.
Можно вообще профайлер использовать.
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
akvvohinc
Время, тратящееся на сам SCAN и REPLACE, можно измерить отдельно
Да, так и приходится делать. Но тут ведь какая штука - доступ к таблицам сам по себе сильно разнится по времени (для идентичного шаблона использования) - от объёма памяти доступной под кэш, от загрузки дисковой подсистемы, от тех же АВ... Нет, если курсор и сравнительно небольшой - то ещё пол-беды, а если что большое то очень уж сильно скакать результат будет. Т.е. ещё один внешний цикл нужен и усреднение результатов. Ну и да - это уже ближе к "интеграционному тестированию", т.е. проверка полной цепочки - и отдельной функции и всей её обвязки в местах использования.

pasha_usue
Можно вообще профайлер использовать.
Можно, но для точности всё равно нужен цикл и усреднение результатов - т.к. его точности явно недостаточно для измерения времени работы таких "быстрых" функций всего за 1 проход.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Igor Korolyov
Если стоит цель проверять именно функцию сортировки чисел в строке, то даже наличие курсора с тестовыми данными (тем более довольно массивного) уже вносит свои погрешности - по хорошему надо либо перетасовывать вызовы тестируемых функций (сначала v1 проверять, потом v2, но при следующем прогоне делать наоборот), или вообще не заморачиваться с курсором и тестированием 100к РАЗНЫХ строк, а тестировать всего десяток "показательных" вариантов такой строки - в простом цикле (да и тот нужен лишь потому что само по себе исполнение такого кода очень быстрое, и точно замерить время одного вызова практически невозможно).

Непонятно, зачем нужно гонять в цикле сомнительные "показательные" строки.
Ничто не мешает в вашем тесте для формирования строк использовать функцию creacurs1 от Криспы, сохранив результаты не в курсоре, а в массиве.
Тогда REPLACE ALL вам больше мешать не будет.



Исправлено 1 раз(а). Последнее : lulgu, 14.10.18 12:51
Ratings: 0 negative/0 positive
Re: Дубли и сортировка чисел в символьной строке
lulgu

Сообщений: 1838
Дата регистрации: 30.11.2016
Ваш тест после небольшого "причесывания":
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 27 (Гостей: 27)

© 2000-2024 Fox Club 
Яндекс.Метрика