2016-10-24 4 views
0

文字が大文字かどうかを確認する必要がある場合は、JavaでCharacter.isUpperCase(char c)を使用できます。これは非常に簡単でシンプルです。文字が大文字かどうかを確認する高速な方法(パフォーマンス)?

[65、90]の範囲内にあるユニコード値を確認することもできます。

switch文がif文より速く実行される方法と同じように、私はそのほとんど無意味ですが、ユニコードチェックをメソッド呼び出しより速く使用するでしょうか?

+2

'Character.isUpperCase(char)'は内部的にどう思いますか? –

+0

"switch文はif文より速く実行されます"あなたはそのベンチマークを投稿できますか? –

+2

"ユニコード値が[65、90]の範囲にある場合、ユニコード値をチェックすることもできます。" ...入力テキストに 'é'が含まれていないと仮定します。クリシェの例のお詫び – VGR

答えて

2

まず第一に、あなたはlikeと似ていません。

Character.isUpperCase(char)メソッドは、文字がUnicodeの大文字であるかどうかをテストします。以下のようなifテスト:文字(7ビット)ASCII大文字であれば

if (ch >= 65 && ch <= 90) 

はちょうどテストします。後者はおそらく簡単なテストなので高速です。しかし、間違ったテストでもあります。

isUpperCaseコードは、すべてのUnicodeコードプレーンで動作する必要があり、一般的なケース(LATIN-1文字)で効率的に動作する必要があるため、複雑です。それを達成するためにいくつかの賢明なことをしていますが、場合によってはswitchを使用しています。そのほとんど重要でないが、ちょうどif文よりも高速に実行されますステートメントを切り替える方法のような、私は確信している


、メソッド呼び出しよりも速くなるユニコードチェックを使用したのでしょうか?

完全なアプリケーションのコンテキストではおそらく重要ではありません。そして標準的なアドバイスはベンチマークであり、あなたの実際のアプリケーションの前にのコードをこのレベルで最適化しようとしています。

質問に答えるために、Javaのswitch文は、JITコンパイラによってbranch tableまたはif ... else if ...テストのいずれかにコンパイルされます。使用すべき決定は、速度対コード空間のトレードオフであり、スイッチアームの数および希薄さに依存する。私はこれを知らないが、JITコンパイラが他の方向の最適化を行うことを疑う。すなわち、一連のif ... else if ...テストのバイトコードからブランチテーブルへのアクセスを含む。

UPDATE:実際には、バイトコード命令セットは、(整数ターゲットの)switch文をコード化する2つの方法を提供します。 JVM spec 3.10を参照してください。 Difference between JVM's LookupSwitch and TableSwitch?も参照してください。したがって、実際には、JITコンパイラではなく、バイトコードコンパイラで意思決定が行われる場合があります。

UPDATE 2:しかし、私はJohn Roseのメーリングリストでこれを見つけました。

C2 JITは効率的な概念を使用して、最初からlookupswitchとtableswitch命令を再編成します。最終的には、意思決定ツリーやいくつかのPCジャンプブロックで終わりますが、両方の命令を混在させることができます。

C1 JITは、命令を再編成して、キー範囲(共通分岐ターゲットの実行)を検出し、範囲ごとに1-2回比較して処理します。奇妙なことに、これの上に意思決定ツリーを置くことも、ジャンプテーブルを試みることもありません。

出典:任意のレートでhttp://compiler-dev.openjdk.java.narkive.com/dg9XUG39/compiling-large-switch-statements

は、JITコンパイラに最速のコードを達成するための最善の機会を与えるために、switchステートメントを使用する方が良いでしょう。そして確かに、switchを使用すると、コードの意図が明確になります。

しかし、反復するには、isUpperCaseのような複雑なものに対して単純なifのテストを比較することは、公平な(または特に意味のある)比較ではありません。私はifバージョンがもっと簡単であるため、より速くなると期待しています。

+0

他にも実装があります。 Watcom Cコンパイラは、大規模なスパースケースセットのバイナリ検索を生成するために使用されていました。 – EJP

+0

@EJP - 私はそれを知らなかった。そして、ボックスの外で考えてみると、「完璧なハッシュ関数」を見つけようとすることを含め、他の戦略もあります。しかし、私はJITコンパイラがこれらのことを行うのではないかと疑っています。スタートのために、最近はメモリがかなり安いです。 –

関連する問題