· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Microsoft

Посл.отвђт Сообщенiе


Дата: Ноя 19, 2003 09:15:49

Исходник:

// first.cpp
int main(void)
{
return 0;
}


Скомпилировано cl /MD first.cpp и скормлено IDA:
[Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86]

.text:00401000 sub_401000 proc near ; CODE XREF: start+13Ep
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 xor eax, eax
.text:00401005 pop ebp
.text:00401006 retn
.text:00401006 sub_401000 endp


Скомпилировано icl /MD first.cpp и скормлено IDA:
[Intel(R) C++ Compiler for 32-bit applications, Version 7.0 Build 20021018Z]

.text:00401000 sub_401000 proc near ; CODE XREF: start+13Ep
.text:00401000 push ebp
.text:00401001 mov ebp, esp
.text:00401003 sub esp, 3
.text:00401006 and esp, 0FFFFFFF8h
.text:00401009 add esp, 4
.text:0040100C xor eax, eax
.text:0040100E mov esp, ebp
.text:00401010 pop ebp
.text:00401011 retn
.text:00401011 sub_401000 endp

Для чего Intel Compiler добавил шаманство с sub esp, 3 / and esp, 0FFFFFFF8h / add esp, 4?
Может это выполняется за меньшее число тактов? И еще тогда ворпос - как замерить, сколько
тактов требует тот или иной фрагмент кода (asm) не прибегая к расчетам?

Спасибо


Дата: Ноя 19, 2003 09:24:27

По виду кода оптимизирован он вроде для Pentium4, должен выполниться быстрее. Замерить можно через VTune.


Дата: Ноя 19, 2003 09:27:21 · Поправил: q_q

cmpw
Наверное, чтобы "хитро" выровнять указатель стека.

Похожий вопрос вопрос по листингу асма


Дата: Ноя 19, 2003 10:55:40 · Поправил: SolidCode

Количество тактов можно посчитать с помощью инструкции RDTSC.
Поищи в форуме. Подобных вопросов было уже много.


Дата: Ноя 19, 2003 11:33:23

Спасибо за ответы. Но вопросы еще есть.

2dragon
А как объяснить, что больший по размеру код будет работать быстрее на P4? Спасибо за инфо про VTune.

2q_q
А зачем его сначала менять (sub esp, 3), а потом выравнивать?

2SolidCode
Спасибо за инфо о RDTSC, я начну с VTune - может оно проще.


Дата: Ноя 19, 2003 11:46:57

cmpw
зачем его сначала
Стек "растет" от старших адресов к младшим, вычитают чтобы "железно" не испортить его "нижнее" содержимое.


Дата: Ноя 19, 2003 11:58:17

как объяснить, что больший по размеру код будет работать быстрее на P4
спариванием инструкций, разворачиванием циклов, отсутствием условных переходов, etc...


Дата: Ноя 19, 2003 12:15:30

Стек "растет" от старших адресов к младшим, вычитают чтобы "железно" не испортить его "нижнее" содержимое.

Ну это понятно. Я про то, что нахера вычитать и тут же прибавлять обратно?

спариванием инструкций, разворачиванием циклов, отсутствием условных переходов, etc...

Это я и сам написал. Интересует конкретно - как в данном случае это положительно сказывается. На пальцах объяснить.


Дата: Ноя 19, 2003 13:03:27

cmpw
вычитать и тут же прибавлять
Чтобы решить задачу выравнивания как можно эффективнее сточки зрения скорости, проверки типа "надо - не надо" - это ветвление. Пусть в стеке будет неиспользованное место (в худшем случае 2 байта).


Дата: Ноя 19, 2003 13:37:59

2q_q

Ты походу прикалываешся.


Дата: Ноя 19, 2003 15:33:28

А кто сказал что интеловски вариант будет быстрее? Он будет медленнее! Но зато он быдет следить чтобы стэк был выровнян до 4х байт, а выравнивание мог испортить левый инит в crt. Так штааа это просто аллергия на слово main - назови функцию по другому и получишь обычное xor eax,eax / retn


Дата: Ноя 20, 2003 05:23:59

cmpw
прикалываешся
Нет. Пытаюсь пояснить, что выравнивание esp должно повысить скорость доступа к стеку. И что вариант ic достаточно эффективен.

Dr.Golova
Он будет медленнее!
По сравнению с чем? С кодом, в котором нет выравнивания?


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.104