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