好的。我是微基准的误判的东西。如果你没有多余的时间,请不要阅读。
而不是
double[] my_array=new array[1000000];double blabla=0;
for(int i=0;i<1000000;i++)
{
my_array[i]=Math.sqrt(i);//init
}
for(int i=0;i<1000000;i++)
{
blabla+=my_array[i];//array access time is 3.7ms per 1M operation
}我用过
public final static class my_class
{
public static double element=0;
my_class(double elementz)
{
element=elementz;
}
}
my_class[] class_z=new my_class[1000000];
for(int i=0;i<1000000;i++)
{
class_z[i]=new my_class(Math.sqrt(i)); //instantiating array elements for later use(random-access)
}
double blabla=0;
for(int i=0;i<1000000;i++)
{
blabla+=class_z[i].element; // array access time 2.7 ms per 1M operations.
}
}循环开销几乎是每1M循环迭代0.5毫秒(使用此偏移量)。
类的数组的元素访问时间比基元数组的少%25。问:你知道其他更短的随机访问时间的方法吗?英特尔2 2Ghz单核java -eclipse
发布于 2012-06-28 23:35:57
再次查看您的代码,我可以看到在第一个循环中您添加了1m个不同的元素。在第二个示例中,您将添加相同的static元素1m次。
微基准测试的一个常见问题是您执行测试的顺序会影响结果。
例如,如果有两个循环,则第一个循环最初不会编译为本机代码。然而,在一段时间之后,整个方法将被编译,循环将运行得更快。
然后运行第二个循环,发现它要么是
您需要将每个循环放在一个单独的方法中,并交替多次运行测试以获得可重现的结果。
在第一种情况下,循环直到运行一段时间后才进行优化。在第二种情况下,您的循环在启动时很可能已经被编译。
发布于 2012-06-28 23:52:44
这种差异很容易解释:
将不同的对象放入您的类数组中,您将看到原始数组的性能更好。你现在是在把橙子比作苹果。
发布于 2013-01-26 05:28:46
你的基准和上面的评估有几个问题。首先,您的代码不能如图所示进行编译。其次,您的基准时间(即几毫秒)太短了,在当今的高速处理器上没有任何统计价值。第三,将苹果与橙子进行比较(如上所述)。也就是说,您将对两个完全不同的用例进行计时:一个静态变量和一百万个变量。
我修复了你的代码,并在i7-2620m上运行了几次,重复了10,000,000,000次。所有结果都在+/- 1%以内,这对于本讨论来说已经足够好了。然后,为了比较它们的性能,我选择了其中最快的一个。
上面,您声称第二个用例比第一个用例“低了25%”。这是非常不准确的。
为了进行“静态”和“可变”性能比较,我更改了第一个基准测试,添加了999,999平方根,就像第二个基准测试一样。对于第二种用例,差异仅为4.63%。
为了进行数组访问性能比较,我将第二个用例更改为一个“非静态”变量。第一种用例(原始数组访问)的差异约为68.2%,这意味着第一种方法比第二种方法快得多。
(请随时向我询问有关微基准测试的更多信息,因为我从事性能测量和评估已有25年之久。)
https://stackoverflow.com/questions/11247791
复制相似问题