Я нашел следующий вопрос: Действительно ли fastcall быстрее?
Не было дано четких ответов для x86, поэтому я решил создать тест.
Вот код:
#include
int __fastcall func(int i)
{
return i + 5;
}
int _stdcall func2(int i)
{
return i + 5;
}
int _tmain(int argc, _TCHAR* argv[])
{
int iter = 100;
int x = 0;
clock_t t = clock();
for (int j = 0; j <= iter;j++)
for (int i = 0; i <= 1000000;i++)
x = func(x & 0xFF);
printf("%d\n", clock() - t);
t = clock();
for (int j = 0; j <= iter;j++)
for (int i = 0; i <= 1000000;i++)
x = func2(x & 0xFF);
printf("%d\n", clock() - t);
printf("%d", x);
return 0;
}
На всякий случай Результатов без оптимизации в MSVC 10 является:
4671
4414
С максимальной оптимизацией fastcall
иногда работает быстрее, но я думаю, это шум многозадачности. Вот средний результат (с iter = 5000
)
6638
6487
stdcall
выглядит быстрее!
Вот результаты для GCC: http://ideone.com/hHcfP
Опять же, fastcall
проиграл гонку.
Вот часть разборки в случае fastcall
:
011917EF pop ecx
011917F0 mov dword ptr [ebp-8],ecx
return i + 5;
011917F3 mov eax,dword ptr [i]
011917F6 add eax,5
это для stdcall
:
return i + 5;
0119184E mov eax,dword ptr [i]
01191851 add eax,5
i
передается через ECX
вместо стека, но сохраняется в стеке в теле! Таким образом, все эффекты игнорируются! эту простую функцию можно вычислить, используя только регистры! И между ними нет реальной разницы.
Кто-нибудь может объяснить, в чем причина fastcall
? Почему не дает ускорения?
Edit: При оптимизации оказалось, что обе функции встроены. Когда я отключил встраивание, они оба скомпилированы в:
00B71000 add eax,5
00B71003 ret
Это действительно похоже на отличную оптимизацию, но при этом совершенно не соблюдаются соглашения о вызовах, поэтому тестирование нечестно.