Java,最昂贵的陈述?

时间:2009-09-08 00:59:43

标签: java optimization bytecode micro-optimization

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

6 个答案:

答案 0 :(得分:8)

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

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

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

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

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

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

答案 1 :(得分:5)

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

经典上最糟糕的是计算方面的差异。但是这些天的计算很便宜,记忆也很遥远。因此,现代硬件上最昂贵的调用是错过缓存的内存访问。走出主内存会花费500到1000个CPU周期。

如下所示:

   x++;
如果x已被推出缓存,那么

...可能需要数百个周期。最常见的例子是遍历内存中的链表。

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

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

答案 2 :(得分:2)

可能,至少对于cpu周期,异常处理。

答案 3 :(得分:1)

我敢打赌,睡眠()必须是最昂贵的! ;)

您的问题需要更多详情。人们总是可以写

while(true) {}

它将无休止地燃烧CPU周期。你在谈论什么类型的陈述?

涉及IO的任何内容或将序列化代码的内容,例如对System.out的调用。

答案 4 :(得分:1)

就CPU周期而言:

public class Zombie extends Thread {
    public void run() {
        while (true)
        {(new Zombie()).start();}
    }

    public static void main(String args[]) {
        (new Zombie()).start();
    }
}

Borrowed and adapted from here,虽然不完全是一句话。

答案 5 :(得分:1)

OP,看看BCEL project,您可能会对学习Java ByteCode的具体细节感兴趣。