私は現在、単純な最適化に関する本を読んでいます。 た図示アルゴリズムのいずれかを:なぜbreak関数はforループに余分な処理時間を追加しますか?
プリント + B = C + D、B、C、Dが 未満で(のすべてのソリューション1000)
(それは私の遅いネットブック上で迅速に実行しますので、私は100と一緒に行きました)
I programmed up their solution(その解決法とその最初に提供された最適化が含まれています)しかし、提案されたブレーク最適化は実際にアルゴリズムをかなり遅くしました。
public static void doUnoptimised() {
for(int a = 1; a < 100; a++)
{
for(int b = 1; b < 100; b++)
{
for(int c = 1; c < 100; c++)
{
for(int d = 1; d < 100; d++) {
if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
{
System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
}
}
}
}
}
}
public static void doFirstOptimised() {
for(int a = 1; a < 100; a++)
{
for(int b = 1; b < 100; b++)
{
for(int c = 1; c < 100; c++)
{
for(int d = 1; d < 100; d++) {
if(Math.pow(a, 3) + Math.pow(b, 3) == Math.pow(c, 3) + Math.pow(d, 3))
{
System.out.println("A:" + a + " B:" + b + " C:" + c + " D:" + d);
break;
}
}
}
}
}
}
なぜですか?これは私の解決策ではないことに注意してください。これは本に示されたものですが、後でさらに最適化が行われますが、この最適化がなぜこのような壮大な失敗であったかに興味があります。
編集 - おそらく私はここで十分に明確ではない。私はこれがほとんど目に見えない変化であることを知っています。なぜこれが改善であるのかを理解しており、本で提供されているより良い最適化を既に行っています。 (しかし、より良い最適化を与えてくれてくれてありがとう、努力を感謝する)しかし、この特定のステップ1は全く働かないし、なぜか分かっている。しかし、この段階で私のjvmはちょっと変わったようです。
は直接関係のコードを投稿してくださいです、リンクとしてではありません。 – Fildor
Javaでのマイクロベンチマーキングは、JITが行う複雑なヒューリスティックがすべてあるため難しいことに注意してください。その結果、誤解を招くのは簡単です。「Javaで正しいマイクロベンチマークを書くにはどうすればよいですか?」(http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java/) – Jesper
を参照してください。これを試してみると、最適化によって実際には速度が遅く、速度は遅くなりました。D – Mark