ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

ダフズデバイスでループ回数を減らす

テキスト

ハイパフォーマンスJavaScript

ハイパフォーマンスJavaScript

お題

4.1.2 ループのパフォーマンスより

ループにもオーバヘッドがあるので、
ループ(処理)
よりも、
ループ(1/8)(処理×8)
の方が速いっていう話。

計ってみた

Javaでも速くなるのかどうなのか、試しに計ってみた on Macbook Air

$ java -version
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07-334-10M3326)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02-334, mixed mode)

- hoge(普通のループ) hoge2(ダフズデバイス)
1回目 33 41
2回目 33 41
3回目 33 40
4回目 32 41
5回目 33 40
平均 32.8[ms] 40.6[ms]

というわけで、ダフズデバイスの完敗となりました。。
なんでやろ。

完全なソース

public class test2 {
	public static void main(String[] args) throws Exception {

		int[] hoge = new int[20000000];
		for(int i=0, len=hoge.length; i<len; i++) {
			hoge[i] = i+1;
		}

		long startTime = System.currentTimeMillis();
		
		System.out.println(sum(hoge));

		long endTime = System.currentTimeMillis();
		System.out.println(endTime - startTime);

		long startTime2 = System.currentTimeMillis();
		
		System.out.println(duffsum(hoge));
		
		long endTime2 = System.currentTimeMillis();
		System.out.println(endTime2 - startTime2);
	}

	private static long sum(int[] data) {
		long result = 0;
		
		for(int i=0, len=data.length; i<len; i++) {
			result += data[i];
		}
		
		return result;
	}

	private static long duffsum(int[] data) {
		long result = 0;
		
		int iterations = data.length % 8;
		int i=data.length -1;
		
		while(iterations > 0) {
			result += data[i--];
			iterations--;
		}
		
		//iterations = (int)Math.floor(data.length / 8);
		iterations = data.length / 8;
		
		while(iterations > 0) {
			result += data[i--];
			result += data[i--];
			result += data[i--];
			result += data[i--];
			result += data[i--];
			result += data[i--];
			result += data[i--];
			result += data[i--];
			iterations--;
		}
		
		return result;
	}
}