4

ここでの私の最初の投稿です。

質問が曖昧に見えるかもしれないことを私は知っています私は明確にしようとします...

インタプリタ言語をターゲットにせずにグローバルに(私は現在C#を使用していますが、答えは他の人にも役立つはずです...)

私は、このタイプの呼び出しを行うのだろうか:

Afunction(var1,var2,AnotherFunction(var3,var2,AthirdFunction(Avector.z)),Mathf.RoundToInt(Avector.x));

より速く実行されます:

Type var1 = avalue;
Type var2 = avalue;
Type var3 = avalue;
Type var4 = AthirdFunction(Avector.z);
Type var5 = Mathf.RoundToInt(Avector.x);
Type var6 = AnotherFunction(var3,var2,var4);

Afunction(var1,var2,var6,var5);

2番目の方法の方が読みやすいことは知っていますが、おそらくこの関数を広範囲に呼び出すことを知っているので、実行速度は速くなります(たとえば、グラフィックアプリではすべてのフレーム)。そして、メモリの使用については、関数を使用した直後にそれを破棄するために、より多くの変数を作成するか、できるだけ少ない変数を宣言しながら「Afunction」内のすべてを直接コーディングする方が良いです...

(そして理解のために:Afunction(), AnotherFunction() and AthirdFunction()すでにどこかで宣言されています)

この種の質問がフォーラムの使用規則の範囲外ではないことを願っています...

4

1 に答える 1

1

妥当なコンパイラーを想定すると、Afunction、AnotherFunction、およびAthirdFunctionで使用するアルゴリズムは、上記で尋ねた他のどのアルゴリズムよりもパフォーマンスに大きな影響を与えます。一般的に、可能な限り最も効率的な機能が得られたら、何を尋ねたかについて心配します。

さらに、コンパイラーは関数呼び出しをインライン化します。つまり、呼び出し可能です。

return_value = fx( A(), B() );

しかし、コンパイラーのアセンブラー出力に何が渡されるかを調べると、状況がそのように見えない場合があります。

関数呼び出しの呼び出しにはオーバーヘッドがあり、そのオーバーヘッドがどうなるかを決定するのはシステムとコンパイラのアーキテクチャです。

これがawkやBASICのようなインタプリタ言語である場合、関数の外部で物事を線形に呼び出す2番目のコードブロックはより高速に実行されます。もっと正確に言えば、1980年代にDECPDPで行われた。

于 2012-12-15T12:09:48.333 に答える