6

String.ToUpperInvariant()より高速なJeffrey RichterによるC#を介してCLRを読みましたString.ToLowerInvariant()。彼は、これは FCL が ToUpperInvariant を使用して文字列を正規化するためであり、そのためこの方法は非常に最適化されていると述べています。私のマシンでいくつかの簡単なテストを実行すると、ToUpperInvariant()確かにわずかに高速であることに同意します。

私の質問は、関数が実際に技術レベルでどのように最適化されているか、および/または同じ最適化が適用されなかった理由を誰かが知っているかどうかToLowerInvariant()です。


「重複」について:提案された「重複」の質問は、私の質問に対する答えを実際には提供しません。ToUpperInvariantの代わりにを使用する利点は理解していますがToLowerInvariant、知りたいのは、どのように/なぜToUpperInvariantパフォーマンスが向上するかです。この点は、「複製」では扱われません。

4

1 に答える 1

3

を実装する CLR ソースが読みInternalChangeCaseStringやすくなったので、ほとんどが Win32 関数を呼び出していることがわかりますLCMapStringEx。パラメータをLCMAP_UPPERCASE渡す場合と渡す場合のパフォーマンスに関するメモや議論はないようです。呼び出しはフラグを使用します。これにより、コンパイラ (または JITter) による最適化が向上する可能性がありますが、への呼び出しは ap/invoke 呼び出しフレームをセットアップする必要があり、呼び出し自体が機能する必要があるため、多くのことはわかりません。そこで時間が節約されます。LCMAP_LOWERCASEdwMapFlagsInternalChangeCaseStringisToUppertrueLCMapStringEx

おそらく、この推奨事項は他の実装から引き継がれているのでしょうが、いずれにせよ速度が大幅に向上するものは見当たらないのです。

于 2016-03-01T01:44:56.127 に答える