3

非静的メソッドよりも静的メソッドのパフォーマンスに関する懸念は何ですか?静的メソッドはパフォーマンスの点で優れていることを読みましたが、どのように高速であるか知りたいですか?メソッドがインスタンスメンバーを使用していない場合、コンパイラはそれを処理し、静的メソッドとして扱う必要があります。

4

6 に答える 6

7

編集:エリックはここでこれについてもっとコメントし、使用されることあることを示唆していcallます...彼のnew()は保証されていないことに注意してください;-p


元のコンパイラ(1.1より前)では、コンパイラ非仮想インスタンスメソッド(なしthis)を静的として扱いました。null問題は、これがチェックに関するいくつかの奇妙な問題につながることでした。

obj.SomeMethod();

例外をスローしませんでした(に触れなかったobj=null非仮想メソッドの場合)。の実装を変更した場合、これは悪いことでした。明示的なヌルチェック(つまり、ヌルチェックしてから静的呼び出し)を追加するコストを調査したところ、仮想呼び出しを使用した場合とまったく同じであることが判明したため、代わりにそれを行ったため、柔軟性が大幅に向上しました。予測可能な。SomeMethodthisSomeMethod

がextension-method(static)の場合、 「例外をスローしない」も完全に動作することに注意してください。SomeMethod

ある時点で、静的呼び出しを介して通常のインスタンスメソッドを呼び出すためにILを発行できると思いますが、最後に試したときに、「ああ、そうじゃない!」というメッセージが表示されました。CLRからのメッセージ(この操作はランタイムを不安定にする可能性があります); 彼らはこれを完全にブロックしたか、(おそらくもっと可能性が高いですが)私はカスタムILを中止しました。

于 2009-12-14T06:18:33.140 に答える
5

はい、静的呼び出しの方が高速です。メソッドを呼び出す前にオブジェクトのインスタンスを作成する必要はありません。(明らかに違いに気付かないでしょうが)

実際には、コンパイラがメソッドを最適化する(インスタンスメソッドを静的にする)かどうかは関係ありません。インスタンスをすでに作成していない限り、インスタンスメソッドを呼び出すことはありません。

結局のところ、ここかそこかで3ナノ秒を節約しようとするのではなく、保守性のためにコードを最適化するように努めるべきです。

于 2009-12-14T07:01:50.930 に答える
3

この質問を参照してください。

抜粋は次のとおりです。

静的呼び出しは、インスタンスメソッドを呼び出すたびにインスタンスを作成するよりも4〜5倍高速です。ただし、まだ1回の呼び出しで数十ナノ秒しか話していません

于 2009-12-14T06:13:17.763 に答える
1

自分でチェックすることはできますが、コンパイラがそれを静的メソッドとして扱うとは思えません。利点は、インスタンスを作成しないことです。心配するガベージコレクターはありません。そして、静的コンストラクターがあれば、それだけが呼び出されます。

于 2009-12-14T06:15:02.183 に答える
0

インスタンスを構築するため、静的メソッドは高速です

インスタンスを作成して静的メンバーを保存するだけの場合は購入すると、パフォーマンスは同等になります

全体的なパフォーマンスは非常に小さいです

それで .......

于 2009-12-14T06:32:53.467 に答える
0

はい静的メソッドは高速ですが、静的変数によって取得されたメモリはGCによって制御されず、不要な場合でも解放されないため、これが問題になります。

しかし、何よりも、メモリと速度が数日で増加したため、allpicationの設計を検討する必要がありますが、静的変数を適切に使用しないと、設計がうまくいかない可能性があります。

于 2009-12-14T07:47:43.130 に答える