O FastCall é realmente mais rápido?
-
25-09-2019 - |
Pergunta
A Convenção de Chamada FastCall é realmente mais rápida do que outras convenções de chamadas, como o CDECL? Existem referências por aí que mostram como o desempenho é afetado pela convocação?
Solução
Depende da plataforma. Para um Xenon PowerPC, por exemplo, pode ser uma diferença de ordem de magnitude devido a um problema de carga de carga com dados de passagem na pilha. Eu empiricamente cronometei a sobrecarga de um cdecl
função em cerca de 45 ciclos em comparação com ~ 4 para um fastcall
.
Para um X86 fora de ordem (Intel e AMD), o impacto pode ser muito menor, porque os registros são todos sombreados e renomeados de qualquer maneira.
A resposta é realmente que você precisa compará -la a uma plataforma específica de que se preocupa.
Outras dicas
A Convenção de Chamada FastCall é realmente mais rápida do que outras convenções de chamadas, como o CDECL?
Eu acredito que a implementação microsofts de fastcall
Em x86 e x64, envolve a passagem dos dois primeiros parâmetros nos registros, em vez de na pilha.
Como normalmente salva pelo menos quatro acessos de memória, sim, geralmente é mais rápido. No entanto, se a função envolvida for folhada por registro e, portanto, é provável que os escreva para os habitantes locais na pilha de qualquer maneira, é provável que não haja um aumento significativo.
Chamar a Convenção (pelo menos no X86) não faz muita diferença na velocidade. No Windows, _stdcall
foi feito o padrão porque produz resultados tangíveis para programas não triviais, pois geralmente resulta em menor tamanho de código quando comparado com _cdecl
. _fastcall
não é o valor padrão porque a diferença que faz é muito menos tangível. O que você compensa no argumento que passa por registros que perde em órgãos de função menos eficientes (como mencionado anteriormente pelo anon.). Você não ganha nada passando nos registros se a função chamada imediatamente precisar derramar tudo na memória para seus próprios cálculos.
No entanto, podemos divulgar idéias teóricas o dia inteiro - compare seu código para a resposta certa. _fastcall
será mais rápido em alguns casos e mais lento em outros.
No x86 moderno - não. Entre o cache L1 e o LING, não há lugar para o FastCall.