2016-11-10 11 views
1

最適化について読んだとき、私はループの展開についての話題を取り上げました。 Googleで小さな検索をすることで、Javaのコンパイラがこれを行うかどうかはわかりませんでした。Javaのパフォーマンス - ループの展開

したがって、私の自己によって試してみるのが最善の方法でした。

実際、このループを展開することで実際には私はかなり驚いていました。私はそれをスピードアップすることができました。

public static void folded() { 
    System.out.println("Folded:"); 
    long c1 = System.currentTimeMillis(); 

    for (int r = 0; r < 10; r++) { 
     for (int i = 0; i < 500000; i++) { 
      Math.sin(i); 
     } 
    } 
    System.out.println(System.currentTimeMillis() - c1); 
} 

public static void unFolded() { 
    System.out.println("Unfolded:"); 
    long c1 = System.currentTimeMillis(); 

    for (int r = 0; r < 10; r++) { 
     for (int i = 0; i < 500000; i += 10) { 
      Math.sin(i); 
      Math.sin(i + 1); 
      Math.sin(i + 2); 
      Math.sin(i + 3); 
      Math.sin(i + 4); 
      Math.sin(i + 5); 
      Math.sin(i + 6); 
      Math.sin(i + 7); 
      Math.sin(i + 8); 
      Math.sin(i + 9); 
     } 
    } 
    System.out.println(System.currentTimeMillis() - c1); 
} 

結果(COUNTER 500'000):つ折り

:453

非折り畳み:114

結果(COUNTER 5'000'000):つ折り

:13850

アンフォールディング:11929

私は何を信頼すべきですか?手動最適化またはコンパイラ?このテストでは、私の結果は、手動による最適化がより良いと思われることを示しています。

+2

http://codereview.stackexchange.com/ – Freiheit

+0

に掲載されているコード最適化に関する質問であるため、このトピックをオフトピックとして閉じるよう投票しています。この種のテストを本当にしたいのであれば'javap'を介して指示を調べる –

+2

http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-javaを読むことを検討してください。 – bradimus

答えて

0

展開されていない操作を並列化できる場合は、アンフォルダーループが役立ちます。そのため多くの現代のCPUはベクタ命令をサポートしていますhttps://en.wikipedia.org/wiki/Vector_processor

7u40から始まるJava for server compilerはベーシックベクタ命令http://bugs.java.com/view_bug.do?bug_id=6340864をサポートしています。 arrayA[0..n] + arrayB[0..n]など詳細Do any JVM's JIT compilers generate code that uses vectorized floating point instructions?

あなたのケースでは、展開された操作はMath.sin(...)で、これは1つのCPU命令です。結果として、Javaはそれを既知のCPUベクトル命令に変換することはできず、ループと比較して性能を向上させることができます。

+2

この回答は自己矛盾しています。 JITコンパイラがループを展開してパフォーマンスを向上させる可能性があることは、Javaレベルでのループのアンロールが何らかの影響を与える可能性があるというOPの主張を直接打ち消してしまうことが説明されています。しかし、それを指摘しておらず、代わりに「罪」という点をベクトル化することはできません。含意することによって、偽りを主張する。「もし罪がベクトル化できれば、OPの主張は正しいだろう」 –

関連する問題