Главная страница
    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
1-13626
jen_bond
2002-07-24 21:35
2002.08.05
Запустить 1С как Ole контейнер


14-13778
Химик
2002-07-10 10:46
2002.08.05
Задачка на засыпку


7-13828
Losyara
2002-05-18 22:46
2002.08.05
Ошибка Large Fonts


3-13536
michael_B
2002-07-15 11:58
2002.08.05
Подскажите компонент!!!


14-13777
Александр
2002-07-09 14:09
2002.08.05
Флайт Симулятор от Майкрософт





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский