乘法比数组访问快吗?

Kon*_*ner 8 java optimization

令我惊讶的是,当通过预生成阵列中的结果与原始的8毫秒相比来"优化"乘法时,我得到更长的时间(10毫秒).这只是一个Java怪癖还是PC架构的一般?我有一个带有Java 7,Windows 8 64位的Core i5 760.

public class Test {
    public static void main(String[] args)  {
        long start = System.currentTimeMillis();
        long sum=0;
        int[] sqr = new int[1000];
        for(int a=1;a<1000;a++) {sqr[a]=a*a;}

        for(int b=1;b<1000;b++)
//          for(int a=1;a<1000;a++) {sum+=a*a+b*b;}
            for(int a=1;a<1000;a++) {sum+=sqr[a]+sqr[b];}
        System.out.println(System.currentTimeMillis()-start+"ms");
        System.out.println(sum);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*Ali 12

Konrad Rudolph 基准测试的问题发表了评论.所以我忽略了基准并专注于这个问题:

乘法比数组访问快吗?

是的,很有可能.它曾经是20或30年前的另一种方式.

粗略地说,你可以在3个周期内进行整数乘法(悲观,如果你没有得到向量指令),如果从L1高速缓存中直接得到它,则存储器访问需要花费4个周期但是它从那里直接下坡.供参考,请参阅


Ingo在下面的评论中指出了一个特定于Java的东西:你也可以在Java中检查边界,这使得已经较慢的数组访问速度更慢......