本当に速くfastcallですか?
-
25-09-2019 - |
質問
本当に速いなどCDECLなどの他の呼び出し規約、より呼び出し規約fastcallですか? そこに任意のベンチマーク性能が規則を呼び出すことによってどのように影響されるかというショーはありますか?
解決
これは、プラットフォームに依存します。キセノンPowerPCのためには、例えば、それが原因スタック上にデータを渡すと、ロードヒットストアの問題に大きさの差のオーダーすることができます。私は、経験的にcdecl
ため〜4に比べて約45サイクルでfastcall
関数のオーバーヘッドを計時。
はアウトオブオーダーのx86(IntelおよびAMD)の場合、影響は、はるかに小さくてもよい。
答えは本当にあなたが気に特定のプラットフォーム上でそれをベンチマークに自分を必要とするということです。
他のヒント
fastcall呼び出し規約は、CDECLなどの他の呼び出し規約、より本当に速いですか?
私はx86およびx64上のfastcall
のMicrosoftの実装は、レジスタではなく、スタック上の最初の2つのパラメータを渡す必要と考えています。
は、はい、それは一般的に高速です。関連する機能は、レジスタに飢えているので、おそらく、とにかくスタック上の地元の人々にそれらを記述することである場合には、大幅に増加する可能性がありません。
(少なくともx86版)規則を呼び出すと、実際に速度差の多くを作成しません。 _stdcall
と比較した場合、それは通常、小さなコードサイズになり、その中で、それは自明でないプログラムのための具体的な成果を生成するのでWindowsでは、_cdecl
はデフォルト行われました。落札差がはるかに少ない有形であるため、デフォルト値は_fastcall
ではありません。 (以前アノンで述べたように。)あなたはレジスタを介して渡す引数に補うため何が少なく、効率的な関数本体で失います。あなたは、呼び出された関数ならば、レジスタに渡すことによってゲイン何でもすぐに、独自の計算のためにメモリにすべてをこぼさする必要はありません。
しかし、私たちは一日中、理論的なアイデアを噴出することができます - 正しい答えのベンチマークコードを。 _fastcall
は、いくつかのケースで速くなり、他では遅くなります。
現代のx86の - いいえ。 L1キャッシュの間とでライニングfastcallのための場所はありません。