Java中的运营成本

Java中的运营成本,java,Java,是否有理由告诉我们,以毫秒或浮点为单位的处理器操作有多昂贵? 我会对“instanceof”感兴趣,演员阵容(我听说他们非常“昂贵”) 有关于这方面的研究吗?这将取决于您使用的JVM,即使在同一JVM中,许多操作的成本也可能不同,具体取决于具体情况以及JIT执行了多少优化 例如,虚拟方法调用仍然可以由热点JIT内联-只要它没有被任何其他内容覆盖。在某些情况下,对于服务器JIT,它仍然可以内联一个快速类型测试,最多可以内联两种类型 基本上,JIT非常复杂,不太可能有一个有意义的通用答案来回答这个问

是否有理由告诉我们,以毫秒或浮点为单位的处理器操作有多昂贵? 我会对“instanceof”感兴趣,演员阵容(我听说他们非常“昂贵”)


有关于这方面的研究吗?

这将取决于您使用的JVM,即使在同一JVM中,许多操作的成本也可能不同,具体取决于具体情况以及JIT执行了多少优化

例如,虚拟方法调用仍然可以由热点JIT内联-只要它没有被任何其他内容覆盖。在某些情况下,对于服务器JIT,它仍然可以内联一个快速类型测试,最多可以内联两种类型


基本上,JIT非常复杂,不太可能有一个有意义的通用答案来回答这个问题。你应该以尽可能真实的方式对自己的具体情况进行基准测试。您通常应该以简单易懂和可读性为主要目标编写代码,但要定期测量性能。

由于在软件执行的各个级别上进行了大量优化,计算指令或周期可以让您对某些代码的性能有一个好的了解的时间早已过去

这对于基于VM的语言尤其适用,JVM可以跳过一些步骤,因为它知道这不是必需的

例如,我不久前在一篇文章中读到(我将尝试最终找到并链接它),这两种方法在成本上几乎相当(在HotSpot JVM上,即):

显然,第一种方法做了更多的工作,但是JVM知道
o
的类型已经在
if
中进行了检查,并且可以跳过以后对cast的类型检查,使其成为不可操作的

这和许多其他优化使得计算“失败”或周期变得毫无用处

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

描述为什么要“编写哑代码”


2002年也有一篇文章描述了这一点。

一旦JVM预热,大多数操作都可以用纳秒(百万分之一毫秒)来计算。当谈论昂贵的东西时,你通常不得不说它相对于另一种选择来说是昂贵的。几乎不可能在所有情况下都将某件东西描述为昂贵的


通常,最重要的花费是您的时间(以及您团队中的其他开发人员)使用
instanceof
在开发和代码支持时间上可能非常昂贵,因为这通常表明设计很差。使用适当的OOP技术通常是一个更好的主意。一个
实例可能需要10纳秒的时间,通常相对来说是微不足道的。

在CPU内部执行特定操作的成本几乎与性能无关。如果性能不好,几乎总是因为IO(网络、磁盘)或效率低下的代码。编写高效的代码更重要的是找到一种方法来减少操作的总量,而不是避免“昂贵”的操作(除了成本高出几个数量级的操作,如IO)。

这取决于VM实现和底层处理器体系结构,以及潜在的其他因素。
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);
}