有没有一种方法可以告诉我们,处理器操作的价格是多少毫秒或flops?我对"instanceof"和转换很感兴趣(我听说它们非常"昂贵")。
有关此事是否有相关研究?
有没有一种方法可以告诉我们,处理器操作的价格是多少毫秒或flops?我对"instanceof"和转换很感兴趣(我听说它们非常"昂贵")。
有关此事是否有相关研究?
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
。
JVM预热后,大多数操作可以以纳秒(千分之一微秒)计算。在谈论某个东西是否昂贵时,通常需要与另一种选择进行对比才能说明其是否昂贵。
通常,最重要的开销是时间(以及团队中的其他开发人员)。使用instanceof
可能会在开发和代码支持时间上产生昂贵的费用,因为它通常表示设计较差。使用适当的面向对象编程技术通常是一个更好的选择。一个instanceof
可能需要10纳秒的时间,通常相对不太重要。
在CPU内执行的特定操作的成本几乎从不影响性能。如果性能差,几乎总是因为IO(网络、磁盘)或低效代码。编写高效的代码更多地是要找到一种减少总操作数量的方法,而不是避免“昂贵”的操作(除了那些成本高出数个数量级的操作,例如IO)。