Java 编程语言中最昂贵的语句(字节码和 CPU 周期)是什么?
6 回答
在任何语言中,您都可以通过多次执行各种语句并查看它们需要多长时间来了解各种语句的速度。我想你的问题比这更聪明。例如,在这个场景中,执行了许多调整步骤,并且在每个步骤中,其他一些问题是主要问题。
第一步:主要耗时相当于递增迭代器。(修复?使用整数索引。)
解决这个问题后,问题是一次构建一个元素的链表。(修复?一次构建它们。)
重新设计后,主要问题是为对象分配和释放存储空间。(修复?重复使用使用过的对象。)
在每个阶段,一些问题是最大的。在解决这个问题(并获得良好的加速)之后,其他一些问题是新的最大问题。修复之后......(依此类推,直到你能看到最大的问题是什么,但你无法修复它)。
你看,它几乎与“哪些语句最昂贵”无关。如果一个陈述正在做你绝对需要做的事情,而你找不到更好的方法来做,那么根据定义,它是最适合这项工作的陈述。
这没有一个简单的答案。这取决于您的虚拟机和底层硬件。您使用的 VM 可能会将您的字节码编译为机器码,因此问题是:硬件上最昂贵的汇编调用是什么。
传统上,最糟糕的是计算方面的分歧。但是现在计算很便宜,而且内存也很遥远。因此,现代硬件上最昂贵的调用是错过缓存的内存访问。转到主内存需要 500-1000 个 CPU 周期。
所以一行如:
x++;
...如果 x 已被推出缓存,可能需要数百个周期。最常见的例子是遍历内存中的链表。
for (ListElement n = ...; n != null; n = n.next()) { n.val++; }
这里每次调用n.next()
可能需要 500-1000 个周期,因为链表可以稀疏地分布在系统内存中。
可能,至少对于 cpu 周期,异常处理。
我敢打赌 sleep() 必须是最昂贵的方法之一!;)
您的问题需要更多详细信息。总能写出来
while(true) {}
它会无休止地消耗 CPU 周期。你在说什么类型的陈述?
任何涉及 IO 或将序列化您的代码的东西,例如对 System.out 的调用。
在 CPU 周期方面:
public class Zombie extends Thread {
public void run() {
while (true)
{(new Zombie()).start();}
}
public static void main(String args[]) {
(new Zombie()).start();
}
}
借用并改编自这里,尽管不可否认,这并不完全是一个单一的陈述。
OP,看看BCEL 项目,您可能会对它感兴趣,以了解有关 Java ByteCode 的细节。