Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
三元条件导致Java中奇怪的CPU使用_Java_Cpu Usage_Ternary Operator - Fatal编程技术网

三元条件导致Java中奇怪的CPU使用

三元条件导致Java中奇怪的CPU使用,java,cpu-usage,ternary-operator,Java,Cpu Usage,Ternary Operator,我运行这段代码是为了比较计算环绕坐标的3种等效方法的性能: public class Test { private static final float MAX = 1000000; public static void main(String[] args) { long time = System.currentTimeMillis(); for (float i = -MAX; i <= MAX; i++) {

我运行这段代码是为了比较计算环绕坐标的3种等效方法的性能:

public class Test {
    private static final float MAX = 1000000;

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        for (float i = -MAX; i <= MAX; i++) {
            for (float j = 100; j < 10000; j++) {
                method1(i, j);
                //method2(i, j);
                //method3(i, j);
            }
        }
        System.out.println(System.currentTimeMillis() - time);
    }

    private static float method1(float value, float max) {
        value %= max + 1;
        return (value < 0) ? value + max : value;
    }

    private static float method2(float value, float max) {
        value %= max + 1;
        if (value < 0)
            value += max;
        return value;
    }

    private static float method3(float value, float max) {
        return ((value % max) + max) % max;
    }
}
公共类测试{
私有静态最终浮动最大值=1000000;
公共静态void main(字符串[]args){
长时间=System.currentTimeMillis();

对于(float i=-MAX;i在审查了各种评论并未能持续复制该行为后。我认为这确实是JRE的侥幸。由于这些评论,我了解到这种基准测试方法不是很有用,我应该使用微观基准测试框架,如谷歌的卡尺来测试这种微小的dif引用

我发现了一些资源:


  • 你没有在这里生成任何新线程。它也不会神奇地为你这样做。如果你看到多个cpu正在使用,要么你的GC疯了,要么你的cpu监控不正确。我怀疑是GC。区别不会在三元运算符中-它将在
    +=
    +
    之间,因为前者是doesn不需要为新值留出空间,后者需要。我想你指的是线程,而不是进程。我支持GC假设,但我想知道你是如何注意到线程正在生成的。没有那么重要,但我在我的框中运行了它,得到的时间几乎相同,第三个稍微慢一点。另外,请记住h保留多个线程并不一定会导致使用多个内核。根据目前的描述,我猜既不是GC也不是任何其他与程序相关的开销。听起来你只是(意外地)在上一次运行尚未完成时单击“运行”按钮多次启动程序(因为,正如你所说,需要“20分钟才能完成”)…投票关闭此程序。请阅读有关微基准点的内容。您的代码没有任何副作用,因此热点编译器可能会在任何时候启动,并决定没有任何可计算的内容。我对许多线程的牵强猜测是编译器线程。为了确保编译器不会优化所有内容,只需总计t他将你的方法输出并最终打印出来。只是一个站点注释:它可能无论如何都不相关。即使你有一个与之相关的场景,那么上下文也很重要:JIT前后发生的事情可以内联或优化它。如果你使用一个好的基准框架(JMH)综合测试单个条件的性能可能更好,但在实际代码中可能不同(并且与性能无关)。