首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减少了java中无需数组边界检查的数组访问时间

减少了java中无需数组边界检查的数组访问时间
EN

Stack Overflow用户
提问于 2012-06-28 23:21:03
回答 3查看 371关注 0票数 1

好的。我是微基准的误判的东西。如果你没有多余的时间,请不要阅读。

而不是

代码语言:javascript
复制
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
}

我用过

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-28 23:35:57

再次查看您的代码,我可以看到在第一个循环中您添加了1m个不同的元素。在第二个示例中,您将添加相同的static元素1m次。

微基准测试的一个常见问题是您执行测试的顺序会影响结果。

例如,如果有两个循环,则第一个循环最初不会编译为本机代码。然而,在一段时间之后,整个方法将被编译,循环将运行得更快。

然后运行第二个循环,发现它要么是

  • 速度更快,因为它从一开始就进行了优化。(对于简单循环)
  • 要慢得多,因为它在没有任何运行时指标的情况下进行了优化。(对于复杂循环)

您需要将每个循环放在一个单独的方法中,并交替多次运行测试以获得可重现的结果。

在第一种情况下,循环直到运行一段时间后才进行优化。在第二种情况下,您的循环在启动时很可能已经被编译。

票数 2
EN

Stack Overflow用户

发布于 2012-06-28 23:52:44

这种差异很容易解释:

  • 原始数组的内存使用量为1M *8字节=8MB。
  • 类数组的内存使用量为1M *4字节= 4MB,全部指向相同的实例(假设32位VM或压缩的refs 64位VM)。

将不同的对象放入您的类数组中,您将看到原始数组的性能更好。你现在是在把橙子比作苹果。

票数 1
EN

Stack Overflow用户

发布于 2013-01-26 05:28:46

你的基准和上面的评估有几个问题。首先,您的代码不能如图所示进行编译。其次,您的基准时间(即几毫秒)太短了,在当今的高速处理器上没有任何统计价值。第三,将苹果与橙子进行比较(如上所述)。也就是说,您将对两个完全不同的用例进行计时:一个静态变量和一百万个变量。

我修复了你的代码,并在i7-2620m上运行了几次,重复了10,000,000,000次。所有结果都在+/- 1%以内,这对于本讨论来说已经足够好了。然后,为了比较它们的性能,我选择了其中最快的一个。

上面,您声称第二个用例比第一个用例“低了25%”。这是非常不准确的。

为了进行“静态”和“可变”性能比较,我更改了第一个基准测试,添加了999,999平方根,就像第二个基准测试一样。对于第二种用例,差异仅为4.63%。

为了进行数组访问性能比较,我将第二个用例更改为一个“非静态”变量。第一种用例(原始数组访问)的差异约为68.2%,这意味着第一种方法比第二种方法快得多。

(请随时向我询问有关微基准测试的更多信息,因为我从事性能测量和评估已有25年之久。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11247791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档