0
public class FactorFinder{
  public static void main(String[] args) {      
    long n = ((long)Integer.MAX_VALUE+1)*2;
    boolean isPrime=true;

    for(long i=2;i<=n/2;i++){
        if(n%i==0){
            System.out.println(i + " is a factor of " + n);
            isPrime = false;
        }   
    }    
    if(isPrime == true) System.out.println(n+ " is a prime number");   
  }     
}      

上記のコードを記述して、因数nを見つけるか、因数がない場合は「nは素数」と出力します。プログラムが完全に実行されるまでにかかる時間を確認するために、コードのすぐそこに一時的にn = 2^32を設定しました。1分17秒かかりました。

次に、forループを次のように変更しました

for(long i=2;i<n;i++){

プログラムが完了するまでに2倍の時間がかかると予想していました。ご想像のとおり、私の質問を読んだので、1分17秒しかかかりませんでした。

プロセッサは、nが2 ^ 32/2を超えた後、ループを実行する必要がないこと、または実行したとしても、ループを実行する必要がないことをどういうわけか知ることができると思いますか? ifステートメントの条件はもうありませんか?

Windows 7で実行されているIntelコアi3、JDK1.7.0があります。

4

2 に答える 2

1

私のマシンの n/2 バージョンでは半分の時間がかかりました。コンパイラが、あなたが考えている最適化の種類を理解できるほど賢いわけではありません。

2 回目のテストを行う前に、ソース ファイルを保存して再コンパイルすることを覚えていましたか? それを忘れることで、あなたが得た結果を説明することができます。それ以外に考えられません。

于 2012-11-18T07:11:17.560 に答える
0

コンパイラが不必要な計算を実行しようとしないのは非常に賢明です。i > root(n) の場合、n が i で割り切れるかどうかをチェックする必要がないからです。

于 2013-03-08T08:08:47.670 に答える