Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Что выполняется быстрее


Страницы:   1 2

AndreiKvin ©   (2002-07-23 15:48:00) 

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

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

или

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


Johnmen   (2002-07-24 11:41:00) [1]

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

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


Anatoly Podgoretsky   (2002-07-24 11:11:00) [2]

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


Внук   (2002-07-24 10:18:00) [3]

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


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

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

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

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


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

>Внук ©

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



Внук   (2002-07-24 08:53:00) [6]

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


Johnmen   (2002-07-23 17:34:00) [7]

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

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


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

Внук © (23.07.02 16:42)

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


Alx2   (2002-07-23 16:44:00) [9]

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


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

Без 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:42:00) [11]

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


Внук   (2002-07-23 16:42:00) [12]

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


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

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:38:00) [14]

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


Внук   (2002-07-23 16:36:00) [15]

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


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

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


Johnmen   (2002-07-23 16:34:00) [17]

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


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

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


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

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 15:50:00) [20]

Одинаково


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо