Я нашел следующий вопрос: Быстро ли работает fastcall?
Никаких четких ответов для x86 не было дано, поэтому я решил создать тест.
Вот код:
#include <time.h>
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
? Почему это не ускоряет?
Изменить: С оптимизацией оказалось, что обе функции встроены. Когда я обернулся, они оба скомпилированы для:
00B71000 add eax,5
00B71003 ret
Это похоже на большую оптимизацию, но это не относится к условным соглашениям вообще, поэтому тест нечестный.