Fastcall呼び出し規約は、cdeclなどの他の呼び出し規約よりも本当に高速ですか?呼び出し規約によってパフォーマンスがどのように影響を受けるかを示すベンチマークはありますか?
プラットフォームによって異なります。たとえば、Xenon PowerPCの場合、スタックにデータを渡す際のロードヒットストアの問題が原因で、桁違いの違いが生じる可能性があります。 cdecl
のオーバーヘッドを約45サイクルで経験的に計時しましたが、fastcall
のオーバーヘッドは約4サイクルでした。
アウトオブオーダーのx86(IntelおよびAMD)の場合、レジスターはすべてシャドウイングされ、いずれにせよ名前が変更されるため、影響ははるかに少ない可能性があります。
答えは、実際には、関心のある特定のプラットフォームで自分でベンチマークする必要があるということです。
Fastcall呼び出し規約は、cdeclなどの他の呼び出し規約よりも本当に高速ですか?
X86およびx64でのMicrosoftのfastcall
の実装には、スタックではなくレジスタで最初の2つのパラメータを渡すことが含まれると思います。
通常、少なくとも4回のメモリアクセスを節約できるため、一般的に高速です。ただし、関連する関数がレジスター不足であり、スタック上のローカルに書き込む可能性が高い場合は、大幅な増加は見込めません。
呼び出し規約(少なくともx86では)は、速度に大きな違いはありません。 Windowsでは、_stdcall
がデフォルトになりました。これは、_cdecl
と比較すると、通常、コードサイズが小さくなるという点で、重要なプログラムに対して具体的な結果が得られるためです。 _fastcall
はデフォルト値ではありません。これは、それによって生じる違いがはるかに具体的でないためです。レジスタを介して渡される引数で補うものは、効率の低い関数本体で失われます(Anonが以前に述べたように)。呼び出された関数がそれ自体の計算のためにすべてをメモリにすぐにこぼす必要がある場合、レジスタを渡すことによって何も得られません。
ただし、理論的なアイデアを1日中吐き出すことができます。正しい答えが得られるようにコードのベンチマークを行ってください。 _fastcall
は、速い場合と遅い場合があります。
最新のx86では-いいえ。 L1キャッシュとインラインの間にfastcallの場所はありません。