Почему fastcall медленнее, чем stdcall?

Я нашел следующий вопрос: Действительно ли 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  

Это действительно похоже на отличную оптимизацию, но при этом совершенно не соблюдаются соглашения о вызовах, поэтому тестирование нечестно.

23
задан Community 23 May 2017 в 11:47
поделиться