Frage

Ist die Fastcall-Aufrufkonvention wirklich schneller als andere Aufrufkonventionen, wie cdecl? Gibt es irgendwelche Benchmarks gibt, die zeigen, wie die Leistung von Aufrufkonvention betroffen ist?

War es hilfreich?

Lösung

Es hängt von der Plattform. Für einen Xenon PowerPC, zum Beispiel, kann es eine Größenordnung Differenz aufgrund eines Last-Hit-Store-Problems sein mit Daten auf dem Stack übergeben. Ich timed empirisch den Aufwand einer cdecl Funktion bei etwa 45 Zyklen im Vergleich zu ~ 4 für ein fastcall.

Für ein Out-of-Order x86 (Intel und AMD) kann die Wirkung viel weniger, weil die Register sowieso alle beschatten und umbenannt werden.

Die Antwort ist wirklich, dass Sie Benchmarks müssen sie sich auf die jeweilige Plattform, die Sie interessieren.

Andere Tipps

  

Ist die Fastcall-Aufrufkonvention wirklich schneller als andere Aufrufkonventionen, wie cdecl?

Ich glaube, dass Microsofts Implementierung von fastcall auf x86 und x64 beinhaltet vorbei an den ersten beiden Parameter in Registern statt auf dem Stapel.

Da es in der Regel mindestens vier Speicherzugriffe speichert, ja, es ist in der Regel schneller. Wenn jedoch die beteiligten Funktion Register verhungert und ist somit wahrscheinlich, um sie von den Einheimischen auf dem Stack zu schreiben wie auch immer, ist es nicht wahrscheinlich, eine deutliche Steigerung sein.

Aufrufkonvention (zumindest auf x86) nicht wirklich viel Unterschied in der Geschwindigkeit machen. In Windows wurde _stdcall den Standard gemacht, weil es greifbare Ergebnisse für die nicht-triviale Programme erzeugt, dass es führt in der Regel kleinere Codegröße im Vergleich zu _cdecl. _fastcall ist nicht der Standardwert, weil der Unterschied es weniger greifbar ist weit macht. Was Sie in Argumente bilden über Register geben Sie in weniger effizienten Funktion Körper verlieren (wie bereits erwähnt von Anon.). Sie gewinnen nichts durch die in den Registern vorbei, wenn die aufgerufene Funktion zu verschütten alles sofort muss aus in den Speicher für eigene Berechnungen.

Wir können aber den ganzen Tag theoretischen Ideen langen Auslauf - Benchmark-Code für die richtige Antwort. _fastcall wird schneller in einigen Fällen und langsamer in anderen.

Auf modernen x86 - nein. Zwischen L1-Cache und in-Futter gibt es keinen Platz für Fastcall.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top