【问题标题】:In Java, is checking if a value is greater than zero faster than checking if a value equals zero? If so, why? [duplicate]在Java中,检查一个值是否大于零比检查一个值是否等于零快?如果是这样,为什么? [复制]
【发布时间】:2016-12-17 18:44:11
【问题描述】:

我在 Leetcode 上实现了一个 sn-p,我的初始循环是这样运行的:

    //n and x are an integer and a double respectively
    long N = Math.abs((long)n);
    double result = 1;
    while(N != 0){
        if((N & 1) == 1){
            result *= x;
        }
        N = N >> 1;
        x *= x;
    }

整个代码运行时间为 2 毫秒。然后我将N != 0 更改为N > 0,代码运行了1ms。为什么由于此更改而导致运行时跳跃?也就是说,Java是如何实现x != yx > y的?

【问题讨论】:

  • 你只测试过一次吗?每次执行之间会有时间差异,结果并不是说在性能方面存在重大差异。这只是一个标准的“这次花了 x 毫秒”,下次可能是 vica verse。
  • 我认为这个缺陷可能在你的测试中......
  • micro-benchmarks in Java 比你想象的要难得多。你的测量没有你想象的那么精确。
  • 凯文是对的。在运行了更多测试之后,这两个波动的运行时间看起来都在 1ms 和 2ms 之间。我认为 Leetcode 提供了作为官方运行时的运行时上限,而实际运行时必须一直徘徊在 1ms 左右(所以是 1ms 和 2ms)。谢谢!

标签: java conditional


【解决方案1】:

可能是因为当 jvm 检查 N > 0 时,它只查找代表符号的字节,而当 jvm 检查 N != 0 时,它需要遍历变量中的所有字节。

【讨论】:

  • 鉴于现在所有的操作都是 64 位的,并且字节没有单独加载到 CPU,你所描述的这些天可能不适用。
  • 区别可能在于比较一个字节和比较n字节。即使它们一次全部加载到 CPU 中,仍然需要检查它们,这可以在时间测量上产生差异。
  • 这两种操作都不会超过一个时钟周期——它是一条机器指令(在 IA-64 上)。差异并不真正存在,OP自己注意到了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多