ダフズデバイスでループ回数を減らす
テキスト
- 作者: Nicholas C. Zakas,水野貴明
- 出版社/メーカー: オライリージャパン
- 発売日: 2011/03/20
- メディア: 大型本
- 購入: 9人 クリック: 1,176回
- この商品を含むブログ (34件) を見る
お題
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; } }