web-dev-qa-db-ja.com

C#静的関数は、メモリ使用量の削減を超えて、非静的関数よりも優れたパフォーマンスを発揮しますか?

publicまたはprivatestaticターゲットは、メモリ内に静的ターゲットのコピーが1つしかないため、メモリ使用量を削減する必要があると思います。

メソッドは静的であるため、非静的関数で可能なものを超えて、CLRコンパイラによるさらなる最適化の潜在的なポイントになる可能性があるためと思われます。ただ薄っぺらな理論なので、皆さんにお聞きするようになりました。

staticpublicまたはprivateメソッドは、メモリ使用量の削減を超えてパフォーマンス上の利点を提供しますか?

(注:時期尚早の最適化の問題について話す回答には興味がありません。確かにそれは私が毎日従う確かなアドバイスですが、それは時々最適化が必要ないという意味ではありません。(二重否定!)私にふけることを許可します少なくとも好奇心)

42
Mark Rogers

From 静的クラスと静的クラスメンバー(C#プログラミングガイド)

静的メソッドを呼び出すと、Microsoft中間言語(MSIL)で呼び出し命令が生成されますが、インスタンスメソッドを呼び出すと、callvirt命令が生成され、nullオブジェクト参照もチェックされます。ただし、ほとんどの場合、2つの間のパフォーマンスの違いは重要ではありません。

51
Adriaan Stander

スタンダーが言ったことは別として、あなたの質問はインスタンスメソッドが何をするかについての誤解を示唆しています。関数が静的であるかどうかに関係なく、メモリ内の関数コードのコピーはoneのみです。非静的メソッドはオブジェクトを介して呼び出す必要がありますが、オブジェクトはメソッドの独自のプライベートコピーを保持しません。したがって、静的メソッドと非静的メソッドのメモリ使用量は実際には同じであり、他の人が指摘しているように、パフォーマンス特性はほぼ同じです。

非静的メンバー変数ただし、作成するオブジェクトごとに個別に存在します。ただし、プログラムで実際にメモリ関連の問題が発生しない限り、ほとんどの場合、そのメモリ使用量について心配するのは時間の無駄です。

24
JSBձոգչ

これは少しトピックから外れていますが、それでもそれほど重要ではありません。

メソッドの作成staticまたはinstanceの選択は、実行時間に基づくべきではありません(とにかく問題ではないようです)。これは、メソッドがオブジェクトを操作するかどうかに基づいている必要があります。たとえば、すべてのMath。*メソッドは静的ですが、 (ほとんど)String。*メソッドは、Stringインスタンスを操作するため、インスタンスです。私の個人的な哲学:良いデザインは他の場所で保存されるかもしれないいくつかのサイクルを補うべきです

このテーマに関する別の見解:私は最近、静的メソッドは手続き型プログラミングの暗黒時代に戻るため、絶対に避けなければならないため、静的メソッドは悪であると言われた男と協力しました。これにより、オブジェクトの内部にまったく関心のないメソッドにアクセスするためのインスタンスを必要とするクラスの奇妙な例が​​発生しました。

ふぅ、それを私の炉床から得て良かった。

18

良い答え-基本的には問題ではありません。これは、この種のほぼすべての質問に対する答えです。たとえそれが違いを生んだとしても-プログラムの実行時間が1ドルかかる場合、この種の問題は1セントの何分の1かの費用がかかる可能性があり、非常に可能性が高い他にもあること かなりの費用がかかる

1
Mike Dunlavey

MeasureIt 確かに、世界中に広がる超大量のトランザクション処理スーパーコンピューティングクラスターを作成していない限り、それほど大きな違いはありません。

0
Jesse C. Slicer