読者です 読者をやめる 読者になる 読者になる

うさがにっき

読書感想文とプログラムのこと書いてきます

拡張for文のパフォーマンスについて

概要

昔拡張for文を使ったほうがパフォーマンスがいいと指摘されたことがあった
その時は「そーなんだ」としか思わなかったが今になって考えると疑問が色々あるので調べてみた

結論

LinkedList系のポインタを使ったアクセス系は拡張for文を使った方が圧倒的に早い
ArrayList系はオートボクシングで少し遅くなる、少しでも速さを求めるならfor文でまわしたほうがいい

詳細

疑問1 CollectionではObjectしか扱えないため、オートボクシング分逆に遅くなるんじゃないのか?

実際にパフォーマンスを測ってくれているサイトがあった
Listのfor文と拡張for文およびIteratorの実行アクセス速度|渋谷で働くUnity野郎
やはりArrayListではオートボクング分多少だが遅くなるようだ
しかしLinkedListでは圧倒的に拡張for文が早い様子、というかfor文が遅い様子
LinkedLisのIteratorでは次の参照先を覚えているため速度が出るとの記述があるが一応ソースが見てみたい

疑問2 LinkedListのiteratorは次の参照を本当に覚えているのか?

public class LinkedList<E>
     extends AbstractSequentialList<E>
     implements List<E>, Deque<E>, Cloneable, java.io.Serializable

// 省略

	private class ListItr implements ListIterator<E> {
	        private Entry<E> lastReturned = header;
	        private Entry<E> next;
	        private int nextIndex;

// 省略

		public E next() {
			checkForComodification();
			if (nextIndex == size)
				throw new NoSuchElementException();

			lastReturned = next;
			next = next.next;
			nextIndex++;
			return lastReturned.element;
	    }
// 省略

確かに前回返却したポインタを覚えている
for文では毎回最初からポインタを追っていくことを考えれば圧倒的に速度差が出る