-
entry001292
comments
とある資料を作るにあたって、Java で Generics を使った際のパフォーマンスについて調べてみました。
まず、java.lang.ArrayList をベースにして StringArrayList を作成しました。 このクラスは ArrayList 中で型パラメーターを使っている箇所をすべて String に置き換えたものです。 いわゆる String 専用の ArrayList です。 これと同じことは、Generics による ArrayList<String> でも実現できます。 型パラメーターを置き換えただけなので当然ですよね。
それを踏まえて、以下の二つのコードの処理時間を比較して見ましょう。
StringArrayList stringArrayList = new StringArrayList(ARRAY_LENGTH); ... for (int i = 0; i < ARRAY_LENGTH; ++i) { String str = stringArrayList.get(i); }ArrayList<String> arrayList = new ArrayList<String>(ARRAY_LENGTH); ... for (int i = 0; i < ARRAY_LENGTH; ++i) { String str = arrayList.get(i); }すると 1M 要素でおよそ 130-150% ほど StringArrayList のほうが速いという結果になりました。 この理由を探るためにコンパイル後の *.class を逆コンパイルしてみました。
for(int i = 0; i < 0xf4240; i++) { String s = stringArrayList.get(i); }for(int i = 0; i < 0xf4240; i++) { String s1 = (String)arrayList.get(i); }注目すべきは Generics を使用した場合のキャストです。 対照実験として次のコードを測定してみます。
for (int i = 0; i < ARRAY_LENGTH; ++i) { Object obj = arrayList.get(i); }この場合は stringArrayList と arrayList で速度に差はなく、逆コンパイルの結果は次のようになっていました。
for(int i = 0; i < 0xf4240; i++) { Object obj = arrayList.get(i); }キャストがありません。 このことから、自動的に実行されるキャストが、Generics を使った ArrayList のパフォーマンスを押し下げている可能性が高いと結論付けられます。
さすがに、いまさら特定型専用の Collections を再発明すべきだとは思いませんが、本当にカッツカツにパフォーマンスを求める場合はこのあたりも気にする必要があるんですね。
MTEntryMore
トラックバックする
http://mt.mizba.net/system/tb.cgi/1277
コメントを登録する
麦酒堂ではコメントスパムを防止するために,いただいたコメントは管理人が手動でサイトに反映しております.
反映までしばらく時間がかかりますので予めご了承ください.