Java,最昂贵的陈述?

Kev*_*oyd 1 java optimization bytecode micro-optimization

Java编程语言中最昂贵的(字节码和cpu周期)语句是什么?

Mik*_*vey 8

在任何语言中,您可以通过多次执行并查看它们需要多长时间来查找各种语句的速度.我想你的问题比那更聪明.例如,在这种情况下,执行了许多调整步骤,并且在每个步骤中,还有其他问题是主要问题.

  • 第一步:主要的时间接受者相当于递增迭代器.(修复?使用整数索引.)

  • 解决之后,问题是一次构建链表一个元素.(修复?立即构建它们.)

  • 重新设计之后,主要问题是为对象分配和释放存储空间.(修复?重复使用过的物体.)

在每个阶段,一些问题是最大的.在确定(并获得良好的加速)后,其他一些问题是新的最大问题.修复后......(依此类推,直到你可以看到最大的问题是什么,但你无法解决它).

你看,它几乎与"哪些陈述最贵"无关.如果一个语句正在做你绝对需要做的事情,并且你找不到更好的方法来做,那么根据定义它是这项工作的最佳陈述.

  • @silky:我确信有办法,但对我来说这纯粹是学术性的.我很少这样做.对我来说,性能调优几乎与计时有关.它与获取程序状态的随机样本并查看程序实际执行的内容以及询问"这是否真的有必要"有关. (2认同)

Dav*_*haw 5

这没有一个简单的答案.这取决于您的VM和底层硬件.您正在使用的VM可能会将您的字节代码编译为机器代码,因此问题是:硬件上最昂贵的程序集调用是什么.

经典上,最糟糕的是在计算方面的分歧.但是这些天的计算很便宜,记忆也很遥远.因此,现代硬件上最昂贵的调用是错过缓存的内存访问.走出主内存需要500-1000个CPU周期.

所以一行如:

   x++;

...如果x已被推出缓存,则可能需要数百个周期.最常见的例子是遍历内存中的链表.

for (ListElement n = ...; n != null; n = n.next()) {
  n.val++;
}

这里的调用n.next()每次可能需要500-1000个周期,因为链表可以稀疏地分布在系统内存中.