94

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

この SO 投稿では、「Microsoft がそのように最適化した」ため、C# は ToUpper でより効率的であることが示唆されています。しかし、ToLower と ToUpper の変換は、文字列に含まれるものに依存し、通常、文字列には小文字が多く含まれているため、ToLower がより効率的であるという議論も読みました。

特に、私は知りたいです:

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

9 に答える 9

93

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

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

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

于 2008-10-24T18:28:52.890 に答える
31

MSDN のMicrosoftから:

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

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

なんで?マイクロソフトから:

文字列を大文字に正規化する

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

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

  • 開始: ギリシャのロー記号 (U+03f1) ϱ
  • 大文字: 大文字のギリシャ語ロー (U+03a1) Ρ
  • 小文字: 小文字のギリシャ語ロー (U+03c1) ρ

ϱ , Ρ , ρ

.NETフィドル

Original: ϱ
ToUpper: Ρ
ToLower: ρ

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

したがって、どちらかを選択する必要がある場合は、Uppercaseを選択してください。

于 2013-01-02T20:42:23.137 に答える
18

MSDNによると、文字列を渡して大文字と小文字を区別しないように比較を指示する方が効率的です。

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

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

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

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

于 2008-10-24T17:54:39.073 に答える
12

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

C では、または各文字列の個別にアクセス可能な要素 (C 文字列や C++ の STL の文字列型など) を使用する場合、実際にはバイト比較であるため、比較UPPERlower.

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

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

于 2008-10-24T17:51:57.490 に答える
5

マイクロソフトは、最適化ToUpperInvariant()ではなく、最適化しましたToUpper()。違いは、インバリアントはより文化に優しいということです。文化が異なる可能性のある文字列で大文字と小文字を区別しない比較を行う必要がある場合は、インバリアントを使用してください。それ以外の場合、インバリアント変換のパフォーマンスは重要ではありません。

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

于 2008-10-24T17:56:35.013 に答える
4

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

于 2008-10-24T17:56:26.433 に答える
0

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

于 2010-06-04T15:48:48.083 に答える
0

それは本当に問題ではありません。ASCII 文字の場合、それはまったく問題ではありません。いくつかの比較と、どちらかの方向の少しの反転だけです。Unicode は、大文字と小文字が奇妙な方法で変更される文字がいくつかあるため、もう少し複雑になる可能性がありますが、テキストがこれらの特殊文字でいっぱいでない限り、実際には違いはないはずです。

于 2008-10-24T17:52:22.887 に答える