Автор | Сообщение |
|
| |
Пост N: 2777
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.03.13 17:59. Заголовок: Что быстрее ?
if dbseek(user_kodik) dbeval({|| aadd(afilt,nakl_r1->(recno()))},,{|| nakl_r1->kod_kl==user_kodik}) endif или if dbseek(user_kodik) do while nakl_r1->kod_kl==user_kodik aadd(afilt,nakl_r1->(recno())) skip enddo endif или if dbseek(user_kodik) do while nakl_r1->kod_kl==user_kodik dborderinfo(DBOI_SKIPEVAL,,,{|key,rec| if(key==user_kodik,aadd(afilt,rec),)} ) enddo endif Что скажете , практики ?
|
|
|
Ответов - 5
[только новые]
|
|
|
| Администратор
|
Пост N: 2762
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.03.13 19:25. Заголовок: Если рассматривать э..
Если рассматривать эти тесты с локальным DBFCDX, я думаю, быстрее всего будет так: if dbSeek(key) dbOrderInfo(DBOI_SCOPEBOTTOM,,, key) while ! eof() ... skip enddo dbOrderInfo(DBOI_SCOPEBOTTOMCLEAR) endif или if dbSeek(key) dbOrderInfo(DBOI_SCOPEBOTTOM,,, key) dbEval({|| ...},,,,, .t.) dbOrderInfo(DBOI_SCOPEBOTTOMCLEAR) endif В этом случае ключ проверяется непосредственно самим rdd, без выполнения выражение типа nakl_r1->kod_kl==user_kodik
|
|
|
|
| |
Пост N: 2778
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.03.13 19:41. Заголовок: Pasha пишет: Если р..
Pasha пишет: цитата: | Если рассматривать эти тесты с локальным DBFCDX |
| А если с LETO ?
|
|
|
|
| Администратор
|
Пост N: 2763
Зарегистрирован: 23.05.05
|
|
Отправлено: 15.03.13 19:50. Заголовок: Dima пишет: А если ..
Dima пишет: трудно сказать. Смотря что критично. В варианте со scope мы имеем 2 дополнительных запроса на установку/снятие scope, т.е. небольшое увеличение сетевого трафика в варианте f dbSeek(key) while ! eof() .and. ordKeyVal() == key ... skip enddo этих запросов нет, но выполняется чуть больше операций на клиенте: сравнение значения ключа Кстати, для leto я специально делал udf-функцию UDF_dbEval: /* * UDF_dbEval function returns buffer with records by order <xOrder>, and for condition, * defined in <xScope>, <xScopeBottom>, <cFilter>, <lDeleted> parameters * Function call from client: leto_ParseRecords( leto_Udf('UDF_dbEval', <xScope>, <xScopeBottom>, <xOrder>, <cFilter>, <lDeleted> ) ) while ! eof() ... skip enddo dbInfo( DBI_CLEARBUFFER ) */ Она вообще все делает одним запросом.
|
|
|
|
| |
Пост N: 2779
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.03.13 19:53. Заголовок: Понял. Спасибо , буд..
Понял. Спасибо , буду тестить.
|
|
|
|
| |
Пост N: 2780
Зарегистрирован: 17.05.05
|
|
Отправлено: 16.03.13 10:28. Заголовок: Вот и тест afilt:={..
Вот и тест afilt:={} nsec:=seconds() if dbseek(userkod) dbeval({|| aadd(afilt,recno())},,{|| kod_kl==userkod}) endif ? len(afilt) //191327 ? seconds()-nsec //1.92 dbgotop() ******************* afilt:={} nsec:=seconds() if dbseek(userkod) do while kod_kl==userkod aadd(afilt,recno()) skip enddo endif ? len(afilt) //191327 ? seconds()-nsec //1.77 dbgotop() ******************* afilt:={} nsec:=seconds() if dbseek(userkod) aadd(afilt,recno()) do while kod_kl==userkod dborderinfo(DBOI_SKIPEVAL,,,{|key,rec| if(key==userkod,aadd(afilt,rec),)} ) enddo endif ? len(afilt) //191327 ? seconds()-nsec //2.94 dbgotop() ****************** afilt:={} nsec:=seconds() if dbSeek(userkod) dbOrderInfo(DBOI_SCOPEBOTTOM,,, userkod) while ! eof() aadd(afilt,recno()) skip enddo dbOrderInfo(DBOI_SCOPEBOTTOMCLEAR) endif ? len(afilt) //191327 ? seconds()-nsec //0.39
|
|
|
|