質問

本当に速いなどCDECLなどの他の呼び出し規約、より呼び出し規約fastcallですか? そこに任意のベンチマーク性能が規則を呼び出すことによってどのように影響されるかというショーはありますか?

役に立ちましたか?

解決

これは、プラットフォームに依存します。キセノンPowerPCのためには、例えば、それが原因スタック上にデータを渡すと、ロードヒットストアの問題に大きさの差のオーダーすることができます。私は、経験的にcdeclため〜4に比べて約45サイクルでfastcall関数のオーバーヘッドを計時。

レジスタはすべてとにかく影と改名されているため、

はアウトオブオーダーのx86(IntelおよびAMD)の場合、影響は、はるかに小さくてもよい。

答えは本当にあなたが気に特定のプラットフォーム上でそれをベンチマークに自分を必要とするということです。

他のヒント

   fastcall呼び出し規約は、CDECLなどの他の呼び出し規約、より本当に速いですか?

私はx86およびx64上のfastcallのMicrosoftの実装は、レジスタではなく、スタック上の最初の2つのパラメータを渡す必要と考えています。

それは典型的には、少なくとも4件のメモリアクセスを保存しているので、

は、はい、それは一般的に高速です。関連する機能は、レジスタに飢えているので、おそらく、とにかくスタック上の地元の人々にそれらを記述することである場合には、大幅に増加する可能性がありません。

(少なくともx86版)規則を呼び出すと、実際に速度差の多くを作成しません。 _stdcallと比較した場合、それは通常、小さなコードサイズになり、その中で、それは自明でないプログラムのための具体的な成果を生成するのでWindowsでは、_cdeclはデフォルト行われました。落札差がはるかに少ない有形であるため、デフォルト値は_fastcallではありません。 (以前アノンで述べたように。)あなたはレジスタを介して渡す引数に補うため何が少なく、効率的な関数本体で失います。あなたは、呼び出された関数ならば、レジスタに渡すことによってゲイン何でもすぐに、独自の計算のためにメモリにすべてをこぼさする必要はありません。

しかし、私たちは一日中、理論的なアイデアを噴出することができます - 正しい答えのベンチマークコードを。 _fastcallは、いくつかのケースで速くなり、他では遅くなります。

現代のx86の - いいえ。 L1キャッシュの間とでライニングfastcallのための場所はありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top