2010-02-02 5 views
38

La convenzione per le chiamate rapide è più veloce di altre convenzioni di chiamata, come cdecl? Ci sono dei benchmark là fuori che mostrano come le prestazioni sono influenzate dalla convenzione di chiamata?FastCall è davvero più veloce?

+5

"In che modo le prestazioni sono interessate dalla chiamata della convenzione?" Marginalmente. – avakar

+12

Tranne quando è influenzato in modo massiccio. – Crashworks

+1

Vedere anche http://bcbjournal.org/articles/vol4/0004/When_to_use___fastcall.htm?PHPSESSID=7ea0b77df8671b0af9001fbca735c1bc – bluish

risposta

30

Dipende dalla piattaforma. Per un Xenon PowerPC, ad esempio, può essere una differenza di ordine di grandezza a causa di un problema di carico-hit-store con il passaggio di dati sullo stack. Ho calcolato empiricamente il sovraccarico di una funzione cdecl a circa 45 cicli rispetto a ~ 4 per uno fastcall.

Per un x86 out-of-order (Intel e AMD), l'impatto potrebbe essere molto inferiore, perché i registri sono tutti in ombra e rinominati comunque.

La risposta è che è necessario confrontarlo da soli sulla particolare piattaforma a cui tieni.

16

La convenzione per le chiamate rapide è più veloce di altre convenzioni di chiamata, come cdecl?

ritengo che l'attuazione di Microsofts fastcall su x86 e x64 consiste nel far passare i primi due parametri in registri anziché in pila.

Poiché in genere salva almeno quattro accessi alla memoria, sì è generalmente più veloce. Tuttavia, se la funzione coinvolta è affamata di registro ed è quindi probabile che li scriva comunque ai locali in pila, non è probabile che vi sia un aumento significativo.

+4

In x64 c'è solo una convenzione di chiamata –

10

La convenzione di chiamata (almeno su x86) non fa molta differenza in termini di velocità. In Windows, _stdcall è stato impostato come predefinito perché produce risultati tangibili per programmi non banali in quanto di solito risulta in dimensioni di codice inferiori rispetto a _cdecl. _fastcall non è il valore predefinito perché la differenza è molto meno tangibile. Ciò che si compensa in argomenti che passano attraverso registri si perde in corpi di funzioni meno efficienti (come precedentemente menzionato da Anon). Non si guadagna nulla passando in registri se la funzione chiamata ha bisogno di riversare tutto in memoria per i propri calcoli.

Tuttavia, possiamo dare idee teoriche per tutto il giorno: confrontate il vostro codice per la risposta giusta. _fastcall in alcuni casi sarà più veloce e più lento in altri.

8

Su x86 moderno - no. Tra cache L1 e in-lining non c'è posto per la chiamata rapida.

+10

Se una funzione è in linea non è né fastcall né cdecl né altre convenzioni di chiamata. – Crashworks

+7

Esattamente. Il recupero da L1 è a 1 ciclo sul registro - nella maggior parte dei casi è al di sotto del livello di rumore, è difficile persino misurarlo in modo affidabile. E le funzioni in cui alcuni cicli di chiamata sono importanti, la differenza dovrebbe essere comunque sottolineata. – ima

+1

Devo dire che sono d'accordo: qualsiasi funzione che sia abbastanza semplice da trarre vantaggio da una chiamata rapida trarrebbe vantaggio dall'inlining ancora di più. –