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

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

Тонкости в сравнении.


AlexanderMS ©   (2007-10-24 17:17:00) 

Скажите, пожалуйста, зависит ли скорость сравнения от операторов сравнения? Вот, например, участки:

if I = 0
 then Action1
 else Action2


и

if I <> 0
 then Action2
 else Action1


эквивалентны по результату. А по скорости времени выполнения? Понимаю, что время если и отличается, то на доли секунды, но всё-таки хочется разобраться...

Кстати, сюда же:

if not (I = 0)
 then Action2
 else Action1


Ну тут вроде бы менее рационально. А в первых двух случаях?
На ассемблере идёт так (если положить, что в EAX содержиться значение переменной I) :
CMP EAX, 0// одинаковы для обоих случаев
JE @Labelили JNE @Label// вот тут вопрос. Равнозначны ли по времени операторы перехода? (Кстати, есть ли разница JE с JZ)?

Вы можете сказать, что мне больше делать нечего, как этим "грузиться", но, всё-таки, надеюсь, что мне кто-нибудь это всё объяснит (или даст ссылку на хорошее объяснение) :).


guav   (2007-10-26 20:24:00) [1]

Согласен, я именно про конкретный случай а не вообще.


TUser   (2007-10-26 19:35:00) [2]

> Оптимизация по времени выполнения обычно трудоёмка и бессмыслена.

Такаяоптимизация - да. А вот подумать о выборе алгоритма часто стОит.


guav   (2007-10-26 18:26:00) [3]

<off>

> Германн ©   (25.10.07 02:08) [7]

Не обновлял, т.к. решил что раз работаю на С++ и переход на Delphi не предвидится, то нечего мне тут делать. Хотя по привычке всё равно сюда захожу... ок, обновил (это типа тест).
</off>


Германн   (2007-10-25 02:08:00) [4]


> guav ©   (25.10.07 01:47) [6]

И ты, Брут, не обновил свою анкету. :)

Хочешь чтоб твой ник зарегистрировал из вредности кто-то другой?
P.S. Я бы промолчал бы, если бы ник guav был бы мне безразличен.


guav   (2007-10-25 01:47:00) [5]

Оптимизация по времени выполнения обычно трудоёмка и бессмыслена.
Возможны следущие варианты оптимизации, улучшающие удобство чтения:
1. Если идёт несколько проврок подряд, то во избежание лишних отступов удобно пользоватся else if, тогда условия пишутся так, чтобы следующая проверка была в else.
2. Избегать лишних отрицаний. т.е. вместо if not IsInvalidRecord лучше использовать IsInvalidRecord
3. Если в одном из случаев кода больше (именно строк кода), удобнее этот случай поместить в else, чтобы else не было далеко от if.
4. Есть ещё совет делать так чтобы в if была 'нормальная' ситуация а в else 'ненормальная'.


DevilDevil   (2007-10-25 00:32:00) [6]

> Скажите, пожалуйста, зависит ли скорость сравнения от операторов
сравнения?


не зависит

>  Равнозначны ли по времени операторы перехода?
да

>  (Кстати, есть ли разница JE с JZ)?
нет

P.S.
> CMP EAX, 0 // одинаковы для обоих случаев
>JE @Label


почти отдам голову на отсечение, что первая команда будет TEST EAX, EAX


Anatoly Podgoretsky   (2007-10-24 21:47:00) [7]

> ProhodyshiyMimo  (24.10.2007 21:39:03)  [3]

Количество тактов в современных процессорах не фиксировано.


ProhodyshiyMimo   (2007-10-24 21:39:00) [8]

При скоростных процессарах сегодня, это вряд ли будет представлять интерес.

Но если есть в этом смысл, то думаю имеет смысл разложить команды данные команды в asm. Потом посмотреть, что получилось непосредственно в машинных кодах, а дальше рассмотреть вопрос о времени (или количеств тактов) процессора, на выполнение определенных команд. Тем самым можно, думаю, узнать реальную разницу.

Хотя это может буть не совсем верным, так как реализация внутренних алгоритмов выполнения команд в процессоре разными корпорациями (AMD, Intel, Motorola(Точно не помню,  по моему Apple) закладываются по разному.

Не зря же были в свое время споры на тему какой корпорации процессор быстрее вычесляет операции с плавающей запятой или целочисленные операции.


Anatoly Podgoretsky   (2007-10-24 19:55:00) [9]

> AlexanderMS  (24.10.2007 17:17:00)  [0]

Операторы равнозначны, а вот результаты нет, время зависит от того выполнилось условие или нет. Время перехода на then/else различно. Называется предсказание и соответственно пенальти.


Сергей М.   (2007-10-24 17:25:00) [10]


> Равнозначны ли по времени операторы перехода?


Да.

Задержки на отработку механизма предсказания ветвлений при современных размерах CPU-кэшей можно смело игнорировать.


> Вы можете сказать, что мне больше делать нечего, как этим
> "грузиться"


Так ведь и скажем)


Наверх

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