Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.04;
Скачать: CL | DM;

Вниз

Об оптимизации   Найти похожие ветки 

 
Anatoly Podgoretsky ©   (2003-08-16 10:07) [0]

Задачка из борландовской группы, сказать не измеряя данный код о времени выполнения двух идетничных кусков, в которых только переставлены местами команды, одинаковое время или разное, если разное, то какой код быстрее.

1.
sub eax,esi
add eax,$10

2.
add eax,$10
sub eax,esi


 
ZZ ©   (2003-08-16 10:27) [1]

2ой вариант быстрее однозначно :))


 
clickmaker ©   (2003-08-16 13:24) [2]

Но 1ый красивее :))


 
SergP ©   (2003-08-16 14:56) [3]


> clickmaker © (16.08.03 13:24) [2]
> Но 1ый красивее :))


Чем?


 
Calm ©   (2003-08-16 15:10) [4]


> одинаковое время или разное, если разное, то какой код быстрее

Может это шутка и время одинаковое?


 
Романов Р.В. ©   (2003-08-16 15:14) [5]

По моему одинаковое время


 
KSergey ©   (2003-08-16 15:17) [6]

Calm © (16.08.03 15:10)
Может это шутка и время одинаковое?


Я не знаю, но может с конвейером команд какая-нибудь хитрость?


 
Anatoly Podgoretsky ©   (2003-08-16 16:24) [7]

KSergey © (16.08.03 15:17) [6]
С ними


 
Calm ©   (2003-08-16 16:47) [8]

2 Anatoly Podgoretsky © (16.08.03 16:24) [7]
А вы знаете ответ?
Очень интересно. Если никто за неделю правильного ответа не даст, Вы уж скажите, пожалуйста.


 
app ©   (2003-08-16 17:05) [9]

Calm © (16.08.03 16:47) [8]
Мне самому было интерсно про это прочитать, ведь абсолютно одинаково, a-b+10 и a+10-b
Вот разъяснение от Дениса Христенсена

Оба этих примера имеют зависимость на EAX регистр.
Но пример 2 читает из esi позже чем в примере 1.
Если ESI бул загружен сразу перед этими строками, то пример номер 2 будет работать быстрее, чем пример номер 1 поскольку сложение add eax, constant бужет загружено в конвейер вместе с предыдущей загрузкой ESI.

Пример:


1: mov esi, something // зависимость на something, возможна задержки на загрузки из памяти
2: sub eax, esi // ожидание загрузки esi
3: add eax, 10 // ожидание до завершения eax


сравниваем с:

1: mov esi, something // зависимость на something, возможна задержки на загрузки из памяти
2: add eax, $10 // нет зависимости с предыдущей инструкцией, можно выполнить паралельно
3: sub eax, esi // зависимость до eax и esi завершения.


Тут мы видим в ответе еще одну инструкцию в обоих примерах, mov esi, something, без которой не объяснить почему и это также пример как не надо задавать вопросы, в первоначальном вопросе эта информация отсутствовала, но добавление не портит ответа, в обоих случаях код одинаковый, но поменяны местами две команды и это говорит о важности учета зависимойтей и возможного паралельного выполнения команд.


 
Skier ©   (2003-08-16 18:23) [10]

Классно. Весьма и весьма познавательно.
>app © (16.08.03 17:05) [9]
А нет ли какой поправки у Христенсена касающейся процессоров
с технологией HyperThreading ? Или в данном случае она [HyperThreading] не будет играть роли ?


 
Anatoly Podgoretsky ©   (2003-08-16 18:51) [11]

С HyperThreading пока ничего ясного.


 
Dionys   (2003-08-17 00:23) [12]

AGI

AGI — это ситуация, при которой регистр, используемый командой для генерации адреса как базовый или индексный, был приемником предыдущей команды. В этой ситуации процессор тратит один дополнительный такт. Последовательность команд

add edx,4
mov esi,[edx]

выполняется с AGI на любом процессоре.

Последовательность команд

add esi,4 ; U-конвейер - 1 такт (на Pentium)
pop ebx ; V-конвейер - 1 такт
inc ebx ; V-конвейер - 1 такт
mov edi,[esi] ; в U-конвейер - *AGI*, затем 1 такт

выполняется с AGI на Pentium за три такта процессора.

Кроме того, AGI может происходить неявно, например при изменении регистра ESP и обращении к стеку:

sub esp,24
push ebx ; *AGI*

или

mov esp,ebp
pop ebp ; *AGI*

но изменение ESP, производимое командами PUSH и POP, не приводит к AGI, если следующая команда тоже обращается к стеку.

Процессоры Pentium Pro и Pentium II не подвержены AGI.

(C) С.В.Зубков Ассемблер для DOS, Windows и Unix



Страницы: 1 вся ветка

Текущий архив: 2003.09.04;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.024 c
14-10938
sniknik
2003-08-15 01:30
2003.09.04
Не читаются CDROM в Lunix


9-10539
Sword-Fish
2002-10-19 01:23
2003.09.04
Создание 3D игр на GLScene


14-10880
Vint
2003-08-18 13:32
2003.09.04
Пиву - нет !


7-10999
tan
2003-06-20 10:22
2003.09.04
считывание с COM-порта с помощью int14?


1-10798
dnv-nik
2003-08-22 10:41
2003.09.04
Потоки