LibrePDMの日記 このページをアンテナに追加 RSSフィード

2012年09月14日 Javaのイテレータは遅い? #wdpress このエントリーを含むブックマーク

Web+DB Press の Vol.70 に、「Javaの底力 ── 火消しエンジニアが明かすテクニック【第2回】Javaでナノチューニング! …… パフォーマンスを最大限に引き出す書き方」として、このような記事が載っていました。批評のために引用します。


f:id:LibrePDM:20120914082055p:image

f:id:LibrePDM:20120914082056p:image

f:id:LibrePDM:20120914082057p:image

f:id:LibrePDM:20120914082058p:image


これは、このテスト条件下ではもちろん正しいですが、一般化するには危険な記事だと思います。

まず、Iterator が高価(遅い)と書いてありますが、Iteratorインタフェースなので、それが遅いか早いかは、当然その実装クラスに依ります。この記事は、Java6 で、実装クラスは ArrayList を使用しているので、(たまたま)遅いという結果が出ただけです。


Java7 では拡張for文を使っても、遅くなることはないという報告があります。

今更ながら拡張for文について - 草木のにをいに誘われた


Java5/6でも、LinkedList だと(データ構造上当然ですが)大幅にイテレータ(拡張for文)のほうが早いです。

Yoshioriの日記: JavaはIteratorを使うべき理由


拡張for文のほうが、Set や配列にしてもロジックを変えなくて良いし、なにより可読性が高いので、よっぽどのことがない限り拡張for文を使うべきだと思います。

この記事を鵜呑みにして、安易に『拡張for文は使用禁止』などというコーディング規約が作成されないことを祈ります。