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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top