Форум: "Основная";
Текущий архив: 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