Domanda

È la convenzione di chiamata fastcall davvero più velocemente di altre convenzioni di chiamata, come cdecl? Ci sono punti di riferimento là fuori che mostrano come le prestazioni è influenzata da convenzione di chiamata?

È stato utile?

Soluzione

E 'dipende dalla piattaforma. Per un PowerPC Xenon, per esempio, può essere un ordine di grandezza differenza a causa di un problema di carico-hit-store con il passaggio di dati in pila. I empiricamente cronometrato il sovraccarico di una funzione cdecl a circa 45 cicli rispetto a ~ 4 per un fastcall.

Per un x86 out-of-order (Intel e AMD), l'impatto può essere molto meno, perché i registri sono tutte in ombra e rinominato in ogni caso.

La risposta è in realtà che è necessario punto di riferimento da soli sulla piattaforma particolare che ti interessano.

Altri suggerimenti

  

È la convenzione di chiamata fastcall davvero più velocemente di altre convenzioni di chiamata, come cdecl?

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

Dal momento che consente di risparmiare in genere almeno quattro accessi alla memoria, sì, è generalmente più veloce. Tuttavia, se la funzione in questione è il registro morti di fame ed è quindi probabile che scriverli alla gente del posto sulla pila in ogni caso, non è probabile che sia un aumento significativo.

convenzione di chiamata (almeno su x86) in realtà non fa molta differenza di velocità. In Windows, _stdcall è stato fatto il default perché produce risultati tangibili per i programmi non banali, nel senso che di solito si traduce in termini di dimensioni codice più piccolo se confrontato con _cdecl. _fastcall non è il valore di default, perché la differenza che fa è molto meno tangibile. Quello che compensare in argomento passando per i registri si perde nei corpi delle funzioni meno efficienti (come accennato in precedenza da Anon.). Non si guadagna nulla dal passaggio in registri se la funzione chiamata ha bisogno immediatamente di fuoriuscita di tutto fuori nella memoria per i propri calcoli.

Tuttavia, siamo in grado di becco idee teoriche tutto il giorno - punto di riferimento il codice per la risposta giusta. _fastcall sarà più veloce, in alcuni casi, e più lenta in altri.

On x86 moderna - no. Tra la cache L1 e-rivestimento non c'è posto per fastcall.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top