我记得我的教授说new
操作是JVM上最昂贵的操作。这是真的?我的意思是,比打开文件更昂贵?我怎么知道Java中任何操作的成本?例如,找出
int a;
Integer b;
Integer c = new Integer(1);
int[] d = new int[10];
Integer[] e = new Integer[10];
答案 0 :(得分:8)
这是特定于实现的。有可能在现代JVM上,这些都不会带来任何成本。即时编译时,一些JVM会检测到你的对象没有逃脱你的函数范围,并会在堆栈上“免费”分配它们。
您无法真正衡量JVM上最昂贵的操作。如果知道某些东西是昂贵的,那么无论如何,在 Sun Oracle的某个人正在努力降低成本,接下来你知道它将是恒定时间。
在任何编程中唯一被视为昂贵的东西应该是你的算法。
答案 1 :(得分:6)
真的不能说什么是最贵的,但我很确定它不是 new (当然你的构造函数很重,如果有很多东西的话):
HotSpot 1.4.2及更高版本中新Object()的公共代码路径大约是10个机器指令(Sun提供的数据;请参阅参考资料),而C中表现最佳的malloc实现平均需要60个每次调用100条指令(Detlefs,et al。等;请参阅参考资料)。分配性能不是整体性能的一个微不足道的组成部分 - 基准测试表明,许多真实的C和C ++程序,如Perl和Ghostscript,在malloc和free中花费的总执行时间的20%到30% - 远远超过健康的Java应用程序的分配和垃圾收集开销
摘自this文章,请注意它是关于JVM 1.4.2(文章于2005年发布)。从2003年开始的Here's另一个,谈论一些Java性能神话仍在盘旋。而较新的JVM应该比那些时代的版本快得多。
答案 2 :(得分:2)
JVM上的高成本操作是什么?
这可能不是一个有意义或可量化的事情:
while (i < 999) i++;
可能会有ZERO成本。我记得我的教授说new()操作是JVM上最昂贵的操作。这是真的吗?
可能不是。
我的意思是,打开文件?
当然不是。打开文件的过程将创建许多对象。
但是如果你打电话给一个文件打开一个“操作”,那么一个操作有多小或多大?
如何知道Java中任何操作的成本?
编写一个隔离和测量给定操作成本的基准是非常困难的。而且它通常也没有意义,因为JVM优化了操作的序列。
例如,......
之间的区别
即使你的例子很难衡量。例如:
这些陈述的部分成本需要与运行垃圾收集器的成本一起摊销。
JIT编译器可能会决定某些或所有这些语句不会影响计算结果,并完全优化它们。
答案 3 :(得分:1)
在JVM实施和目标平台之间,最昂贵的操作可能会有所不同,因此不会得到非常准确的答案。
一些更“昂贵”的操作肯定是文件/套接字I / O和synchronize()。
垃圾收集也相当昂贵(认为这不是您的代码直接调用的操作,编写代码的方式会影响此成本的发生频率)。
答案 4 :(得分:1)
几乎肯定是假的。特别是如果你在谈论将它与“打开一个文件”(肯定不止一个JVM操作)这样的东西进行比较,那么你可以做到最贵的事情。
如果您正在谈论纯粹的墙壁时间,那么套接字read()
之类的东西可以按秒的顺序进行测量。如果你想要完成一些工作密集的东西,你可以映射一个原生的ByteByffer,这将需要一个银河时代与new()
相比
答案 5 :(得分:1)
打开文件将是操作系统操作,而不是JVM操作。通过操作,您的教练必须意味着Java bytecode instructions。 new()代价很高,因为它需要JVM分配内存并引起连锁反应来初始化对象层次结构。它还可以对GC产生长期影响等。请参阅Java performance tuning。
答案 6 :(得分:0)
最昂贵的操作就是
while(true){}
,但为了全面了解成本,您必须使用分析器或基准测试。但要注意,Java中的Microbenchmarks经常会导致错误的结果,因为JVM非常善于优化代码并删除不必要的语句。
答案 7 :(得分:0)
比较昂贵? 你的成本的“货币”是什么? 很多时候,JVM会分摊在多次调用中分析和优化代码的成本,因此情况可能比您想象的要复杂得多。
作为一般指导原则,你可以运行10000次这些东西并测量时间和记忆,以了解事物的相对成本。