Поиск:

Ответ в темуСоздание новой темы Создание опроса
> инструкция Dec оказывается работает медленнее Sub 
:(
    Опции темы
Delphist
Дата 3.9.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

Репутация: нет
Всего: 3



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

Это сообщение отредактировал(а) Delphist - 3.9.2010, 17:13

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  pic.JPG 41,88 Kb


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
okkonst
Дата 5.9.2010, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



Цитата(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 - и выясняем правду...
  
PM MAIL   Вверх
Mikl_
Дата 6.9.2010, 04:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



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

Это сообщение отредактировал(а) Mikl_ - 6.9.2010, 04:31
PM MAIL   Вверх
okkonst
Дата 6.9.2010, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 33
Регистрация: 5.9.2010
Где: Воронеж

Репутация: нет
Всего: 1



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

Аналоги по действию. А по числу машинных тактов на операцию? Мы ведь, по сути, именно об этом говорим - о времени выполнения. Когда-то давно - точно нет: sub и add были значительно дольше. Теперь - не знаю. Тем более, что обработка команд процессором параллельна. 
PM MAIL   Вверх
Mikl_
Дата 7.9.2010, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 9.11.2007

Репутация: 6
Всего: 14



okkonst
а по числу машинных тактов нужно проверять на живой машине, по тактам все они занимают одинаковое время если судить по справочнику, различие по влиянию на флаги, DEC не влияет на CF и OF, но влияет на AF, ZF, SF; SUB и ADD влияют на CF, OF, AF, ZF, SF; LEA не влияет на флаги совсем
PM MAIL   Вверх
Tronix
Дата 13.9.2010, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Возможно ошибусь, но предположу, что современные профайлеры могут использовать MSR регистры процессора для определения времени выполнения команд. Можно про них почитать вкратце здесь http://wasm.ru/article.php?article=inspr00 (начиная со слов "MSR регистры"). Там же остальные 3 части статьи.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0606 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.