Java操作的成本

6

有没有一种方法可以告诉我们,处理器操作的价格是多少毫秒或flops?我对"instanceof"和转换很感兴趣(我听说它们非常"昂贵")。

有关此事是否有相关研究?


1
这取决于虚拟机实现和底层处理器架构,以及可能的其他因素。 - Merlyn Morgan-Graham
4个回答

8
这将取决于您使用的JVM,即使在同一JVM内,许多操作的成本也可能会有所不同,具体情况取决于情况和JIT执行了多少优化。
例如,如果没有被其他内容覆盖,Hotspot JIT仍然可以内联虚拟方法调用。在某些情况下,使用服务器JIT可以通过快速类型测试仍然内联几种类型。
基本上,JIT非常复杂,因此不太可能对问题有意义的通用答案。您应该尽可能以实际方式对自己特定的情况进行基准测试。您通常应编写具有简单性和可读性的代码,但要定期测量性能。

7
"The time when counting instructions or cycles could give you a good idea about the performance of some code is long gone, thanks to many optimizations happening on all levels of software execution. This is particularly true for VM-based languages, where the JVM can skip steps that it knows are unnecessary. For example, I read an article some time ago (which I will try to find and link eventually) that stated these two methods are almost equally costly on the HotSpot JVM:"
public void frobnicate1(Object o) {
  if (!(foo instanceof SomeClass)) {
    throw new IllegalArgumentException("Oh Noes!");
  }
  frobnicateSomeClass((SomeClass) o);
}

public void frobnicate2(Object o) {
  frobnicateSomeClass((SomeClass) o);
}

显然,第一种方法做更多的工作,但JVM知道o的类型已经在if中被检查过了,实际上可以跳过稍后的类型转换检查,使其成为一个无操作。

这和许多其他优化使得计算“flops”或周期几乎没有用处。

一般来说,instanceof检查是相对便宜的。在HotSpot JVM上,它归结为对象头中类型ID的数字检查。

这篇经典文章解释了为什么你应该“编写愚蠢的代码”。

还有一篇来自2002年的文章,描述了 HotSpot JVM中如何优化instanceof


3

JVM预热后,大多数操作可以以纳秒(千分之一微秒)计算。在谈论某个东西是否昂贵时,通常需要与另一种选择进行对比才能说明其是否昂贵。

通常,最重要的开销是时间(以及团队中的其他开发人员)。使用instanceof可能会在开发和代码支持时间上产生昂贵的费用,因为它通常表示设计较差。使用适当的面向对象编程技术通常是一个更好的选择。一个instanceof可能需要10纳秒的时间,通常相对不太重要。


1

在CPU内执行的特定操作的成本几乎从不影响性能。如果性能差,几乎总是因为IO(网络、磁盘)或低效代码。编写高效的代码更多地是要找到一种减少总操作数量的方法,而不是避免“昂贵”的操作(除了那些成本高出数个数量级的操作,例如IO)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接