Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.05;
Скачать: CL | DM;

Вниз

Что выполняется быстрее   Найти похожие ветки 

 
AndreiKvin ©   (2002-07-23 15:48) [0]

Возник вопрос какая из этих проверок будет выполнятся быстрее

var Key: byte;
...
if Key in [48..57] then

или

var Key: byte;
...
if (Key>47) and (Key<58) then


 
Song ©   (2002-07-23 15:49) [1]

Различие несущественно.


 
Игорь Шевченко ©   (2002-07-23 15:50) [2]

Одинаково


 
Толик ©   (2002-07-23 16:28) [3]

if (Key>47) and (Key<58) then будет выполняться быстрее. Не на много, но быстрее. Это легко проверить, используя QueryPerformanceCounter и QueryPerformanceFrequency и загнав эти проверки в длинный цикл. Например:
for i := 0 to 100000 do
if((k > 47)and(k < 58))then
CONTINUE;

выполняется быстрее, чем
for j := 0 to i do
if((k > 47)and(k < 58))then
CONTINUE;


Но эта разница незначительна.


 
Толик ©   (2002-07-23 16:30) [4]

прошу прощения, во втором примере конечно же
for j := 0 to i do
if(k in [48..57])then
CONTINUE;



 
Johnmen ©   (2002-07-23 16:34) [5]

Первое быстрее, т.к. выполнится 11 проверок,
во втором - только 2.


 
Johnmen ©   (2002-07-23 16:35) [6]

Извиняюсь...Второе...


 
Внук ©   (2002-07-23 16:36) [7]

>>Johnmen © (23.07.02 16:34)
???
Почему 11
А если 11, то почему быстрее?


 
Внук ©   (2002-07-23 16:38) [8]

Если Вы думаете, что вхождение в множество сводится к поочередной проверке всех значений, то Вы ошибаетесь, imho.
Но как верно подметили первые отвечающие - не там блох ловите (это к автору)


 
Толик ©   (2002-07-23 16:39) [9]

Johnmen © (23.07.02 16:34)
На самом деле всё не так просто. Например:
for i := 0 to 100000 do
if((k > 47)and(k < 58))then
m := m + 1;

выполняется МЕДЛЕННЕЕ, чем
for j := 0 to i do
if(k in [48..57])then
m := m + 1;

Поразительно, но факт...

PS Засекайте время, и вопросы отпадут сами собой :)


 
Внук ©   (2002-07-23 16:42) [10]

>>Толик © (23.07.02 16:39)
Строго говоря, это не показатель :) Чтобы сказать наверняка, надо смотреть asm и считать кол-во тактов


 
Alx2 ©   (2002-07-23 16:42) [11]

В этом случае вариант со множеством будет быстрее.


 
Игорь Шевченко ©   (2002-07-23 16:43) [12]

Без QueryPerformanceCounter

if(k in [48..57])then

mov eax,@k
mov al,[eax]
add al,$D0
sub al,$0A
jnb $1

... then

$1:

if((k > 47)and(k < 58))then

mov eax,@k
cmp byte ptr[eax], $2f
jbe $2
cmp byte ptr[eax], $3a
jnb $2

... then

$2:

Без оптимизации.
Кому интересно, может положить сгенерированный код с включенной оптимизацией.


 
Alx2 ©   (2002-07-23 16:44) [13]

>Толик © (23.07.02 16:39)
ASM код посмотри. Тогда все станет понятно :)


 
Игорь Шевченко ©   (2002-07-23 17:14) [14]

Внук © (23.07.02 16:42)

Количество тактов считать трудно...Не все так просто в современных процессорах...


 
Johnmen ©   (2002-07-23 17:34) [15]

>Внук © (23.07.02 16:38)
>Если Вы думаете, что вхождение в множество сводится к
>поочередной проверке всех значений, то Вы ошибаетесь, imho

Почему же я ошибаюсь ? Как по Вашему осуществляется указанная проверка ?



 
Внук ©   (2002-07-24 08:53) [16]

>>Johnmen © (23.07.02 17:34)
Смотрите asm-код, приведенный >>Игорь Шевченко © (23.07.02 16:43)
Множество - это все-таки не динамический массив.
>>Игорь Шевченко © (23.07.02 17:14)
Другого точного способа я не вижу :)


 
Johnmen ©   (2002-07-24 10:00) [17]

>Внук ©

Как по Вашему осуществляется указанная проверка ? На пальцах.
Ж-)




 
Юрий Зотов ©   (2002-07-24 10:08) [18]

"На пальцах" примерно так.

Множество - это набор битовых флагов. Поэтому, чтобы проверить вхождение элемента во множество, достаточно проверить ОДИН битовый флаг. Грубо говоря, это некий аналог ОДНОЙ операции AND. И никаких переборов, естественно.

А не на пальцах - приведенный ассемблерный код говорит сам за себя.


 
Внук ©   (2002-07-24 10:18) [19]

>>Johnmen © (24.07.02 10:00)
Меня опередили с ответом :) Но я совсем не в обиде :))). Просто хочу добавить, что неспроста существует ограничение на ord элементов множества, и это ограничение именно 0 - 255.


 
Anatoly Podgoretsky ©   (2002-07-24 11:11) [20]

Внук © (23.07.02 16:42)
Я бы не стал считать количество тактов, так как на современных процессоров это за собой ничего не несет, а програнал бы на большом количестве компьютеров, начиная с 486 и заканчивая P4 + плюс процессоры других фирм, результаты могут трагически отличаться.


 
Johnmen ©   (2002-07-24 11:41) [21]

>Юрий Зотов © (24.07.02 10:08)

Да, разобрался. Благодарю.



Страницы: 1 вся ветка

Текущий архив: 2002.08.05;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.008 c
1-13665
EugenCFG
2002-07-18 23:10
2002.08.05
RichEdit... CheckListBox


4-13854
ProNix
2002-05-24 15:12
2002.08.05
Как сделать чтобы прогу нельзя было выкинуть из памяти


3-13571
big_bugzy
2002-07-09 14:35
2002.08.05
Either BOF or EOF is true, or the current record has been deleted


3-13580
ZLOST
2002-07-14 20:19
2002.08.05
Дайте пример как резалт запроса (тип _Recordset)вывести в DBGRID


4-13861
z1
2002-05-27 17:04
2002.08.05
рабочий стол обновить