【发布时间】:2014-02-04 09:06:52
【问题描述】:
令我惊讶的是,与原来的 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);
}
}
【问题讨论】:
-
那个测量值太短了,几乎不可能准确。这些数字本质上是纯粹随机的。不要把库存放在里面。而且 Java JIT 优化器可能甚至不会启动 1000 次迭代,所以即使时钟非常准确,测量在实际程序的上下文中也毫无意义。
-
但是:请记住,数组访问通常涉及乘法(或至少移位)、加法和提取。完全不清楚的是,在简单的整数情况下,这将比简单的乘法执行得更好。
-
在我的例子中是 4 毫秒(多)与 7 毫秒(添加)。我认为在第一种情况下从堆(java对象内存)访问对象并使用原始类型进行操作的原因是 - 第二种情况。一点处理器花时间不会花时间。
-
您不想在填充数组后启动计时器吗?否则,这不是一个公平的比较。
标签: java optimization