非静的メソッドよりも静的メソッドのパフォーマンスに関する懸念は何ですか?静的メソッドはパフォーマンスの点で優れていることを読みましたが、どのように高速であるか知りたいですか?メソッドがインスタンスメンバーを使用していない場合、コンパイラはそれを処理し、静的メソッドとして扱う必要があります。
6 に答える
編集:エリックはここでこれについてもっとコメントし、使用されることがあることを示唆していcall
ます...彼のnew()
例は保証されていないことに注意してください;-p
元のコンパイラ(1.1より前)では、コンパイラは非仮想インスタンスメソッド(なしthis
)を静的として扱いました。null
問題は、これがチェックに関するいくつかの奇妙な問題につながることでした。
obj.SomeMethod();
例外をスローしませんでした(に触れなかったobj=null
非仮想メソッドの場合)。の実装を変更した場合、これは悪いことでした。明示的なヌルチェック(つまり、ヌルチェックしてから静的呼び出し)を追加するコストを調査したところ、仮想呼び出しを使用した場合とまったく同じであることが判明したため、代わりにそれを行ったため、柔軟性が大幅に向上しました。予測可能な。SomeMethod
this
SomeMethod
がextension-method(static)の場合、 「例外をスローしない」も完全に動作することに注意してください。SomeMethod
ある時点で、静的呼び出しを介して通常のインスタンスメソッドを呼び出すためにILを発行できると思いますが、最後に試したときに、「ああ、そうじゃない!」というメッセージが表示されました。CLRからのメッセージ(この操作はランタイムを不安定にする可能性があります); 彼らはこれを完全にブロックしたか、(おそらくもっと可能性が高いですが)私はカスタムILを中止しました。
はい、静的呼び出しの方が高速です。メソッドを呼び出す前にオブジェクトのインスタンスを作成する必要はありません。(明らかに違いに気付かないでしょうが)
実際には、コンパイラがメソッドを最適化する(インスタンスメソッドを静的にする)かどうかは関係ありません。インスタンスをすでに作成していない限り、インスタンスメソッドを呼び出すことはありません。
結局のところ、ここかそこかで3ナノ秒を節約しようとするのではなく、保守性のためにコードを最適化するように努めるべきです。
この質問を参照してください。
抜粋は次のとおりです。
静的呼び出しは、インスタンスメソッドを呼び出すたびにインスタンスを作成するよりも4〜5倍高速です。ただし、まだ1回の呼び出しで数十ナノ秒しか話していません
自分でチェックすることはできますが、コンパイラがそれを静的メソッドとして扱うとは思えません。利点は、インスタンスを作成しないことです。心配するガベージコレクターはありません。そして、静的コンストラクターがあれば、それだけが呼び出されます。
インスタンスを構築するため、静的メソッドは高速です
インスタンスを作成して静的メンバーを保存するだけの場合は購入すると、パフォーマンスは同等になります
全体的なパフォーマンスは非常に小さいです
それで .......
はい静的メソッドは高速ですが、静的変数によって取得されたメモリはGCによって制御されず、不要な場合でも解放されないため、これが問題になります。
しかし、何よりも、メモリと速度が数日で増加したため、allpicationの設計を検討する必要がありますが、静的変数を適切に使用しないと、設計がうまくいかない可能性があります。