5

どちらが速いですか?これ:

bool isEqual = (MyObject1 is MyObject2)

またはこれ:

bool isEqual = ("blah" == "blah1")

どちらが速いかを理解することは役に立ちます。明らかに、プログラマーがよく行うように文字列比較の両側に.ToUpper()を適用すると、パフォーマンスに影響を与えるメモリの再割り当てが必要になります。しかし、.ToUpper()が上記のサンプルのように方程式から外れている場合はどうでしょうか?

4

8 に答える 8

11

ここで少し混乱しています。

他の回答が指摘しているように、リンゴとオレンジを比較しています。::rimshot::

オブジェクトが特定のタイプであるかどうかを判断したい場合は、is演算子を使用します。

文字列を比較したい場合は、==演算子を使用します (または、大文字と小文字を区別しない比較のような手の込んだものが必要な場合は、他の適切な比較方法を使用します)。

ある操作が他の操作と比較してどれだけ速いか (しゃれは意図されていません) は、実際には問題ではないようです。


よく読んでみると、文字列比較の速度と参照比較 (System.Object の基本型で使用される比較の種類) の速度を比較したいと思います。

その場合、答えは、参照比較が他の文字列比較より遅くなることはないということです。.NET での参照の比較は、C でのポインターの比較とほとんど同じです。

sただし、文字列変数の値"I'm a string"が であるにもかかわらず、次の比較が失敗した場合、どのように感じるでしょうか。

if (((object) s) == ((object) "I'm a string")) { ... }

単純に参照を比較した場合、 の値がどのようsに作成されたかによって、それが発生する可能性があります。インターンされなかった場合、リテラル文字列と同じ参照を持たないため、比較は失敗します。したがって、常に機能するとは限らない高速な比較が行われる可能性があります。それは悪い最適化のようです。

于 2008-11-15T00:50:40.250 に答える
5

書籍 Maximizing .NET Performance によると、呼び出し

bool isEqual = String.Equals("test", "test");

と同じ性能です

bool isEqual = ("test" == "test");

呼び出し

bool isEqual = "test".Equals("test");

静的な String.Equals メソッドの呼び出しよりも理論的には遅いですが、実際に速度の違いを検出するには、数百万の文字列を比較する必要があると思います。

あなたへの私のヒントはこれです。どの文字列比較方法が遅いか速いかは気にしないでください。通常のアプリケーションでは、違いに気付くことはありません。最も読みやすいと思われる方法を使用する必要があります。

于 2008-11-15T00:38:45.253 に答える
4

最初のものは、値ではなく型を比較す​​るために使用されます。文字列を大文字と小文字を区別しないで比較したい場合は、次を使用できます。

string toto = "toto";
string tata = "tata";

bool isEqual = string.Compare(toto, tata, StringComparison.InvariantCultureIgnoreCase) == 0;    

Console.WriteLine(isEqual);     
于 2008-11-15T00:22:54.490 に答える
0

最初の例のオブジェクトの比較は、両方のオブジェクトがメモリ内の同じアドレスを指しているかどうかをチェックするだけなので、ほぼ同じ速度で実行されると思います。

すでに何度か言及されているように、文字列のアドレスを比較することも可能ですが、2つの文字列が異なるソースから割り当てられている場合、これは必ずしも機能するとは限りません。

最後に、可能な限りタイプに基づいてオブジェクトを比較するのが通常は良い形式です。通常、最も具体的な識別方法です。オブジェクトをメモリ内のアドレス以外のもので表す必要がある場合は、他の属性を識別子として使用できます。

于 2009-03-28T01:19:38.503 に答える
0

私が質問を理解していて、参照の同等性を昔ながらの「内容を比較する」と本当に比較したい場合:テストケースを作成してobject.ReferenceEqualsをa==bと比較します。

注:違いが何であるを理解する必要があり、ほとんどのシナリオで参照比較を使用できない可能性があります。これがあなたが望むものであると確信しているなら、それはほんの少し速いかもしれません。自分で試して、これが問題に値するかどうかを評価する必要があります。

于 2009-12-28T10:45:11.247 に答える
0

「==」演算子を使用して文字列を比較すると、文字列の内容と文字列オブジェクト参照が比較されます。オブジェクトを比較すると、オブジェクトの「Equals」メソッドが呼び出され、それらが等しいかどうかが判断されます。Equals のデフォルトの実装では、参照比較を行い、両方のオブジェクト参照が同じ物理オブジェクトである場合に True を返します。これはおそらく文字列比較よりも高速ですが、比較されるオブジェクトのタイプによって異なります。

于 2008-11-15T00:43:11.950 に答える
0

教えてくれませんか?:)

この Coding Horror の投稿からコードを取得し、彼のアルゴリズムの代わりにテストするコードを挿入します。

于 2008-11-15T00:20:38.800 に答える