令我惊讶的是,当通过预生成阵列中的结果与原始的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个周期但是它从那里直接下坡.供参考,请参阅
英特尔64和IA-32架构优化参考手册附录C中的延迟和吞吐量
Herb Sutter关于这个主题的演讲:机器架构:你的编程语言永远不会告诉你的事情
Ingo在下面的评论中指出了一个特定于Java的东西:你也可以在Java中检查边界,这使得已经较慢的数组访问速度更慢......