Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.005 c
4-13851
kserg@ukr.net
2002-05-29 10:40
2002.08.05
Как узнать тип ОС?


3-13539
Mamed
2002-07-15 13:18
2002.08.05
Direct Access 3.1


1-13666
cosinus
2002-07-23 15:57
2002.08.05
Подскажите наиболее правильную организацию поиска по всем локальн


1-13719
Andrew22
2002-07-24 07:39
2002.08.05
Завершение программы


1-13613
MARcoDEN
2002-07-23 21:28
2002.08.05
Combining signed and unsigned types





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский