3

私はこれを検索しようとしましたが、答えを見つけることができませんでした。

メソッドがあり、その中にコードブロック呼び出しが頻繁にあるため、ローカルにリファクタリングしましたFunc

このコード ブロックは他の場所では使用していないため、別のメソッドの代わりにこれを使用することに意味があります。

しかし、パフォーマンスに関しては、別の方法を使用する方が良いのでしょうか? 関数内で宣言されているため、割り当てられたり、他の方法で余分な処理時間やメモリを使用したりしますか?Funcそれとも、コンパイラによって舞台裏でキャッシュされるか、実際にメソッドにされることさえありますか?

マイクロ最適化のように聞こえるかもしれませんが、私の場合、このメソッドは頻繁に呼び出されます。それで考えが変わるのかもしれません。

だから基本的に:

public T CalledVeryOften(...)
{
    Func<...> block = () => ...;

    //code that calls 'block' several times
}

また

public T CalledVeryOften(...)
{        
    //code that calls 'block()' several times
}

private ... block()
{
   ...
}
4

2 に答える 2

3

いや、パフォーマンスに大きな違いはないはずです。Func は、クロージャを使用するかどうかに応じて、静的メソッドまたはインスタンス メソッドにコンパイルされます。

ただし、コードをインライン化できれば、パフォーマンスが向上する可能性があります..多分. しかし、それを行う方法がわかりません。Func

inlineインラインとは、C++ で使用できるキーワードを指しています。これは、関数命令をそのコード ブロックに埋め込むようにコンパイラに指示します。C# がその利点を提供するかどうかはわかりません。

ところで、プライベート メソッドが本当に再利用可能なメソッド ブロックに属しておりFunc、パフォーマンス向上のために使用している場合は、元の方法にリファクタリングします。

于 2013-10-11T14:23:23.277 に答える
3

これマイクロ最適化です:) プログラムが許容できないレベルまで著しく遅くなり、プロファイリングによって、関数呼び出しを行っていることが根本原因であると判断されない限り、代替案を検討できます。

オーバーヘッドは、物事の壮大な計画ではごくわずかです。私は間違いなくこれを「気にする必要のないこと」の下にファイルします。

さらに、その過程でコードが読みやすくなった可能性があります。

于 2013-10-11T14:24:08.660 に答える