![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Что выполняется быстрее
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]Одинаково