【问题标题】:Why does in the following Threading code, the for loop iterates more prime number than if为什么在下面的线程代码中,for循环迭代的素数比if多
【发布时间】:2015-05-10 09:06:01
【问题描述】:

线程在 5 秒时中断。在isPrime 函数中,如果if(num % 2 == 0) 被注释,代码将打印到85427,而如果它只打印到83761。请帮助理解多线程中的这种荒谬行为。

public void run(){

    long number = 1l;

    while(true){
        if(isPrime(number)){
            System.out.println("Number is prime number : " + number);
        }
        if(isInterrupted()){
            System.out.println("The Prime generator has been interrupted");
            return;
        }
        number++;
    }
}

public boolean isPrime(long num){
    if(num <= 2){
        return true;
    }
    else{
        if(num % 2 == 0){
            return false;
        }
        else{
        for(long i = 3; i < num ; i++ ){
            if((num % i) ==  0){
                return false;
            }
        }
    }
    }

    return true;
}

【问题讨论】:

  • 好吧,从顶部开始,我想说的是,如果你删除 IF 条件,你的 CPU 必须做更少的计算,因此它会在 5 秒内计算更多的素数
  • 在运行 5000ms 时,not-if 版本更快,这似乎很奇怪。我可以期望它具有较小的值,但是在某个数字之后,if 版本应该会快得多,因为偶数的处理速度会更快。我想这是一个糟糕的衡量问题,而不是性能问题。
  • 您多久进行一次测试?

标签: java if-statement for-loop


【解决方案1】:

好吧,从我的脑海中,我想说,如果你删除 IF 条件,你的 CPU 必须做更少的计算,因此它会在 5 秒内计算更多的素数。

【讨论】:

    【解决方案2】:

    当删除条件检查时,您正在使线程执行更快,因为您达到了更高的值。

    【讨论】:

      【解决方案3】:

      计算时间的差异为 2%。这可能低于常见的标准错误。

      你有没有做正确的microbenchmarking,找到这些时间?

      顺便说一句,您的代码可以看到一些优化。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 2020-02-07
        • 1970-01-01
        • 2014-11-25
        • 2017-10-13
        • 1970-01-01
        相关资源
        最近更新 更多