Форум » [x]Harbour » Что быстрее ? » Ответить

Что быстрее ?

Dima: [pre2] 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 [/pre2] Что скажете , практики ?

Ответов - 5

Pasha: Если рассматривать эти тесты с локальным 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

Dima: Pasha пишет: Если рассматривать эти тесты с локальным DBFCDX А если с LETO ?

Pasha: Dima пишет: А если с LETO ? трудно сказать. Смотря что критично. В варианте со 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 ) */ Она вообще все делает одним запросом.


Dima: Понял. Спасибо , буду тестить.

Dima: Вот и тест [pre2] 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 [/pre2]



полная версия страницы