web-dev-qa-db-ja.com

大文字と小文字

大文字と小文字を区別しない比較を行う場合、文字列を大文字または小文字に変換する方が効率的ですか?それも重要ですか?

この中の SO post をお勧めします。ToUpperでは、Microsoftが "そのように最適化した"ため、C#の方が効率的です。 この引数 ToLowerとToUpperの変換は、文字列に含まれる内容によって異なり、通常、文字列に含まれる小文字が多くなるため、ToLowerの効率が上がります。

特に、私は知りたい:

  • ToUpperまたはToLowerを最適化して、一方を他方より速くする方法はありますか?
  • 大文字または小文字の文字列間で大文字と小文字を区別しない比較を行う方が速いですか?なぜですか?
  • 1つのケースが他のケースより明らかに優れているプログラミング環境(C、C#、Pythonなど)はありますか?
79
Parappa

大文字と小文字を区別しない比較を行うための大文字または小文字への変換は、一部の文化、特にトルコの「興味深い」機能のために正しくありません。代わりに、適切なオプションで StringComparer を使用してください。

MSDNには、文字列処理に関するいくつかの 素晴らしいガイドライン があります。また、コードが トルコテスト に合格することを確認することもできます。

編集:ordinal大文字と小文字を区別しない比較に関するNeilのコメントに注意してください。この領域全体はかなり暗いです:(

88
Jon Skeet

MSDNの Microsoft から:

。NET Frameworkで文字列を使用するためのベストプラクティス

文字列の使用に関する推奨事項

どうして?から Microsoft

文字列を大文字に正規化します

小文字に変換されたときに往復できない小さな文字グループがあります。

往復できないキャラクターの例は何ですか?

  • Start:Greek Rho Symbol(U + 03f1)ϱ
  • 大文字:キャピタルギリシャロー(U + 03a1)Ρ
  • 小文字:小さいギリシャのロー(U + 03c1)ρ

ϱ、Ρρ

そのため、大文字と小文字を区別しない比較を行いたい場合は、文字列を小文字ではなく大文字に変換します。

22
Ian Boyd

[〜#〜] msdn [〜#〜] によると、文字列を渡し、大文字と小文字を無視するように比較を指示する方が効率的です。

String.Compare(strA、strB、StringComparison.OrdinalIgnoreCase)は(と同等ですが、)呼び出しよりも高速です

String.Compare(ToUpperInvariant(strA)、ToUpperInvariant(strB)、StringComparison.Ordinal)。

これらの比較は依然として非常に高速です。

もちろん、1つの文字列を何度も比較する場合、これは当てはまらない可能性があります。

18
Rob Walker

小文字のエントリが多い傾向にある文字列に基づいて、ToLowerは理論的には高速になります(多くの比較が、割り当てはほとんどありません)。

Cでは、または各文字列の個別にアクセス可能な要素(C文字列やC++のSTLの文字列型など)を使用する場合、実際にはバイト比較です。したがって、UPPERの比較はlowerと違いはありません。

ひそかに、文字列をlong配列にロードした場合、一度に4バイトを比較できるため、文字列全体を非常に高速に比較できます。ただし、ロード時間は価値がない場合があります。

どちらが速いかを知る必要があるのはなぜですか?比較のメトリックバットロードを行っていない限り、数サイクル速く実行することは全体的な実行速度とは無関係であり、早すぎる最適化のように聞こえます:)

12
warren

MicrosoftはToUpperInvariant()ではなくToUpper()を最適化しました。違いは、不変式はより文化に優しいということです。文化によって異なる可能性のある文字列で大文字と小文字を区別しない比較を行う必要がある場合は、Invariantを使用します。そうでない場合、不変変換のパフォーマンスは問題になりません。

ただし、ToUpper()またはToLower()が速いかどうかはわかりません。パフォーマンスがそれほど重要な状況になったことがないので、試したことはありません。

6
Dan Herbert

C#で文字列比較を行う場合、両方の文字列を大文字または小文字に変換する代わりに、.Equals()を使用する方がはるかに高速です。 .Equals()を使用することのもう1つの大きな利点は、2つの新しい大文字/小文字の文字列により多くのメモリが割り当てられないことです。

4
Jon Tackabury

それは本当に重要ではありません。 ASCII文字、それは間違いなく重要ではありません-それはいくつかの比較とどちらの方向のビット反転です。ユニコードは大文字小文字を変えるいくつかの文字があるので、少し複雑かもしれません奇妙な方法ですが、テキストにこれらの特殊文字がいっぱいでない限り、実際に違いはありません。

1
Adam Rosenfield

それを正しく行うと、小文字に変換する場合、速度にわずかなわずかな利点がありますが、これは多くが示唆しているように、文化に依存し、関数ではなく変換する文字列(小文字の多く)メモリへの割り当てが少ないことを意味します)-大文字の文字列がたくさんある場合、大文字への変換は高速です。

1
Clearer

場合によります。上記のように、プレーンASCIIのみ、その同一。 .NETでは、 String.Compare を読み、i18nの内容(言語の文化とUnicode)に適しています。入力の可能性について何か知っている場合は、より一般的なケースを使用してください。

複数の文字列を比較している場合、長さは優れた第一の識別器であることを忘れないでください。

0
Sanjaya R