Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 &引用;mod 4“;对&;3“;演出_Java_Performance - Fatal编程技术网

Java &引用;mod 4“;对&;3“;演出

Java &引用;mod 4“;对&;3“;演出,java,performance,Java,Performance,我试着测试在java中使用var&3是否比var%4更快(也可能是&2^n-1对%2^n)。我已经做了一个简单的程序来计算进行计算所需的平均时间,但是我得到了奇怪的结果,我无法得出结论。对于大约1000次计算,平均值是mod 4需要更多的时间,但是当我尝试大约1000000次计算时,两个平均值大致相同。。。我怀疑这是由于java优化了我的代码,但我不确定 这两个操作中哪一个应该更快?如何实现% 谢谢 编辑:这是我的测试程序 long startTime, time, sum; i

我试着测试在java中使用
var&3
是否比
var%4
更快(也可能是&2^n-1对%2^n)。我已经做了一个简单的程序来计算进行计算所需的平均时间,但是我得到了奇怪的结果,我无法得出结论。对于大约1000次计算,平均值是
mod 4
需要更多的时间,但是当我尝试大约1000000次计算时,两个平均值大致相同。。。我怀疑这是由于java优化了我的代码,但我不确定

这两个操作中哪一个应该更快?如何实现
%

谢谢

编辑:这是我的测试程序

    long startTime, time, sum;
    int iterations = 1000;
    int v;

    sum = 0;
    for(int i = 0; i < iterations; i++)
    {
        startTime = System.nanoTime();
        v = i % 4;
        time = System.nanoTime();
        sum += time-startTime;
    }
    System.out.println("Mod 4 : "+(sum/iterations));

    sum = 0;
    for(int i = 0; i < iterations; i++)
    {
        startTime = System.nanoTime();
        v = i & 3;
        time = System.nanoTime();
        sum += time-startTime;
    }
    System.out.println("& 3 : "+(sum/iterations));
long startTime、time、sum;
int迭代次数=1000次;
INTV;
总和=0;
对于(int i=0;i
经过100次迭代,对于
mod 4
我得到了130纳秒,对于
&3
我得到了25060纳秒

对于1000次迭代,对于
mod 4
我得到1792纳秒,对于
&3
我得到81纳秒


在1000000次迭代中,这两种情况下我都得到了大约50纳秒,而
mod 4
总是比这长几纳秒

Java或任何编译器可能会在静态或运行时(对于具有JIT功能的编译器)对此进行优化,因此很难判断代码的实际功能,但如果您检查最终在任何主机上执行的机器代码,几乎可以保证,执行
操作在延迟(可能还有吞吐量)方面比模运算要快得多。第一个需要非常简单的ALU单元,通常在大多数CPU内核上大量存在,而模运算可能必须在一个更慢和更稀少的除法器单元上执行(即存在于较少的执行端口上)


但是,java代码和实际的裸机CPU之间的层次太多,无法给出具体的答案,您应该切换到较低级别的基准测试(c或汇编),或者考虑其他因素,观察字节码和编译器所做的即时更改。

我很好奇,自己编写了自己的代码。每1000个元素的平均值。请注意,有一些不可忽略的开销,操作本身的速度比要大得多。

这取决于您执行测试的方式。我建议也测试负数。我相信这方面有专家,但Java Hotspot VM有时会选择解释代码的某些部分,而不是将其编译为本机代码(因为编译可能需要比简单解释更多的时间)。可能是这样。运行代码时使用
-Xint
,查看是否是因为在第二个示例中Java将其编译为本机代码。然而,如果结果在数以百万计的测试(所以你有大量的统计数据)时趋于稳定,那么你就应该认为你不能肯定地说一个选项比另一个选项快——它可能只是一个平局。-5%3=-2,而-5&3=3…发布测试和时间可能很有用。