if(str1 == str2)vs if(str1.length()== str2.length()&& str1 == str2)

StackOverflow https://stackoverflow.com/questions/186494

質問

別のコードで2番目のコードを見たことがありますが、この長さの比較はコードの生産性を向上させるために行われたと思われます。特定の辞書を備えたスクリプト言語のパーサーで使用されました。単語は4〜24文字の長さで、平均7〜8字のレテット、アルファベットには26のラテン文字と「@」、「$」が含まれます。および" _"。

長さの比較は、==演算子をSTL文字列で処理するために使用されました。これは、単純な整数比較よりも明らかに時間がかかります。しかし、同時に、指定された辞書の最初の文字の分布は単語サイズの分布よりも単純に広いため、比較する文字列の最初の2文字は、通常、その文字列のサイズよりも異なります。これにより、長さの比較が不要になります。

いくつかのテストを実行しましたが、それがわかったのです。2つのランダムな文字列の比較を100万回テストする間、2番目の方法ははるかに高速であるため、長さの比較が役立つようです。しかし、作業中のプロジェクトでは、デバッグモードではさらに遅くなり、リリースモードでは不十分に速くなります。

だから、私の質問は次のとおりです。なぜ長さの比較が比較を速くすることができ、なぜそれを遅くすることができるのですか?

UPD:私はその2番目の方法も好きではありませんが、それは理由のために行われたもので、この理由は何だと思います。

UPD2:真剣に、問題は最善を尽くす方法ではありません。この場合、STL文字列も使用していません。長さの比較が不必要で間違っているなどの不思議はありません。不思議なのは、ある特定のテストで実際に少し良くなる傾向があることです。これはどのように可能ですか?

役に立ちましたか?

解決

ランダムテストでは、文字列はゲインを表示するのに十分な長さだったかもしれませんが、実際のケースでは短い文字列を扱うことができ、2つの比較の定数因子は、テスト。

他のヒント

問題があれば、あなたのライブラリがすでにそれを行っていると仮定してください。本当に重要でない限り、コードをこのように混乱させてマイクロ最適化を行わないでください。

短絡が有益な場合

ショートサーキットの最適化は、次の場合にのみ役立ちます:

  • 比較のコストは、完全なテストのコストと比較して低い
  • 比較により短絡が発生することが多い

数学的に、Sを短絡状態のコスト、Fを完全な状態のコスト、Pを短絡が発生した場合の割合とします(完全な状態は不要です)。

元のケースの平均コスト(短絡なし)はFです

短絡最適化の平均コストはS + F *(1-P)

したがって、最適化が何らかの利点をもたらす場合、以下を適用する必要があります。

S + F *(1-P)< F

i.e。

S< F * P

文字列比較コスト

さらに書いた:

明らかに単純な整数比較よりも時間がかかります。

これはまったく明らかではありません。文字列比較は、最初の違いが見つかると終了します。したがって、処理する文字列に応じて、ほとんどの場合、最初または2番目の文字で終了します。さらに、両方の文字列に十分なデータがある限り、最初にDWORDS(一度に4文字)を比較することにより、長い文字列に対しても比較を最適化できます。

あなたのケース

ランダムなテストデータとスクリプト解析の主な違いは、実際のデータがランダムではないことです。パーサーは決定論的である可能性が高く、一致すると、それ以上比較しません。スクリプトデータでさえランダムではありません。一部のキーワードは他のキーワードよりも多く使用される可能性があります。パーサーが最も一般的に使用されるキーワードを最初にチェックするように構築されている場合、文字列が一致するときは常に完全な比較を行う必要があるため、驚くほど多くの比較を行うには完全な比較を行う必要があります。

一般的には、これをSTLに任せ、心配する必要はありません。

ただし、これが最適化が必要な領域である場合(これは非常に疑わしい)、文字列の文字分布/長さ分布を理解している場合は、文字列から新しいクラスを派生し、==演算子をオーバーロードできますアプリケーションに対して最も効率的な方法で同等性テストを実行します。 (最初の長さ、最初の文字が最初、前方、後方、何でも)。

「最適化」をコード全体に散在させるよりも良いでしょう。

std :: string operator ==の実装には、最初に長さをチェックするか、文字のチェックを開始する方が速いかどうかを知る方法がありません。長さを明確に確認することは、同じ長さのストリングの無駄です。したがって、STLの実装が異なると、パフォーマンスが異なる可能性があります。

最終的な最適化として明示的な長さチェックを入れるだけで(明確にコメントされている)、プロファイラーが利益を確認した場合のみ。

長さの比較は意味がありません。比較演算子を使用するだけで十分です

STLの実装を起動します。問題ないはずです

長さの比較は、短絡の最適化を試みるためにあります。

完全な文字列比較よりも長さの比較が速いと想定しているため、99%の不一致を解消できれば、毎回完全な文字列比較を行うよりも速くなります。

コードは長さの比較を実行しますが、失敗し、完全な文字列比較を無視してコードをスキップします。

std :: stringの長さは、std :: stringオブジェクトのメンバーである可能性が高いです。それに比べて、最初の文字はヒープ上にある可能性が非常に高いです。つまり、文字列の長さを比較すると、参照の局所性が向上します。もちろん、短い文字列の最適化では、これはさらに複雑になります- Rhs [0] がスタック上にあるときに Lhs [0] がヒープ上にある可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top