Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > инструкция Dec оказывается работает медленнее Sub


Автор: Delphist 3.9.2010, 17:09
Установил супер профайлер AQTime 6.21, который анализирует время работы кода построчно.
Взял в Delphi написал тупой код см. вложение (большие числа слева это машинные циклы на выполнение данной инструкции), и профайлер показал, что DEC работает медленнее чем sub.
Как это?

Автор: okkonst 5.9.2010, 22:21
Цитата(Delphist @ 3.9.2010,  17:09)
профайлер показал, что DEC работает медленнее чем sub.
Как это?

Думаю, на этот вопрос смогут ответить только разработчики профайлера - только они знают, о чем думает их продукт smile. Я вот задумался на другим вопросом: каким образом вообще можно КОРРЕКТНО измерить время выполнения инструкции? При пошаговом исполнении программы время сразу поедет, поскольку будет сбрасываться кэш команд процессора. Втыкать что-то вроде Int3 после каждой АССЕМБЛЕРНОЙ команды и засекать время между вызовами столь же точно, как, скажем, засекать время забега путем почтовой переписки. А если еще вспомнить, что винда многозадачна, и в ЛЮБОЙ момент поток может быть тормознут на неопределенное время... Короче, предлагаю вариант: генерим исходный код такого содержания:

I:=GetTickCount;
asm
  move ecx, 1000000000
  dec ecx
  dec ecx
  dec ecx
[и так еще миллион раз, на самом деле - надо подобрать так, чтобы с секунду думало]
end;
I:=GetTickCount-I;

Даем задаче реалтаймовый приоритет и засекаем время. Потом меняем dec на SUB - и выясняем правду...
  

Автор: Mikl_ 6.9.2010, 04:23
Delphist
аналоги команды DEC EAX
SUB EAX,1
ADD EAX,0FFFFFFFFh
LEA EAX,[EAX+0FFFFFFFFh]
пара команд NEG EAX/NOT EAX
аналог команды DEC ECX
loop $+2 smile 

Автор: okkonst 6.9.2010, 12:22
Цитата(Mikl_ @ 6.9.2010,  04:23)
Delphist
аналоги команды DEC EAX
SUB EAX,1
ADD EAX,0FFFFFFFFh

Аналоги по действию. А по числу машинных тактов на операцию? Мы ведь, по сути, именно об этом говорим - о времени выполнения. Когда-то давно - точно нет: sub и add были значительно дольше. Теперь - не знаю. Тем более, что обработка команд процессором параллельна. 

Автор: Mikl_ 7.9.2010, 03:44
okkonst, 
а по числу машинных тактов нужно проверять на живой машине, по тактам все они занимают одинаковое время если судить по справочнику, различие по влиянию на флаги, DEC не влияет на CF и OF, но влияет на AF, ZF, SF; SUB и ADD влияют на CF, OF, AF, ZF, SF; LEA не влияет на флаги совсем

Автор: Tronix 13.9.2010, 21:46
Возможно ошибусь, но предположу, что современные профайлеры могут использовать MSR регистры процессора для определения времени выполнения команд. Можно про них почитать вкратце здесь http://wasm.ru/article.php?article=inspr00 (начиная со слов "MSR регистры"). Там же остальные 3 части статьи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)