问题 在Java中对象实例化是否存在每方法成本?


我从其他开发人员那里听说,对象太昂贵而无法重复实例化,因为“它有一堆方法”。

我的理解(主要来自Bloch)是对象创建主要是通过在构造函数中明确完成的事情来实现成本,特别是创建其他昂贵的对象。

Java中的新对象是否存在每个方法的成本?我想不是,但如果有人拥有它们我需要参考。

谢谢!


1328
2017-07-09 22:35


起源

我建议创建一个没有方法的类,另一个有100个方法的类,然后计算实例化每个方法需要多长时间一百万次左右。然后再做几次以确保。 (我的下意识反应是不,方法没有区别。但是不要相信我的话。) - Michael Myers♦
我需要为这种事情创建一些计时测试器。那里有没有?另一个问题...... - orbfish


答案:


许多方法意味着很大 虚方法表(VMT)。但是,VMT就像元数据一样每个类,因此在第一个实例化时最多只有一次性成本。假设构造函数不执行繁重的操作,后续实例化与具有较少方法的对象一样快。

值得阅读也是章节 从性能调优书中创建对象


11
2017-07-09 22:38



“......在第一次实例化时,只有一次性成本”。实际上,成本是在课堂加载时产生的。 - Stephen C
感谢你的回答。这本书看起来有点过时,但我正在看一看。 - orbfish
@Stephen C,可能取决于所使用的VM以及JIT的工作原理。这就是为什么我写“最多” - 它可能懒得加载类,并且类可能会很晚加载,基本上由它们的实例化触发。 - Lucero


不,类的方法数和JVM执行的时间之间没有关系 new 操作。

说真的,如果你正在考虑这种级别,你不应该使用像Java这样的语言,去编译你的应用程序或用'C'编写你的应用程序。

事实上,您应该专注于算法和数据结构的设计,这将对您的应用程序性能产生比任何潜在的微优化更深远的影响。


3
2017-07-09 22:46



+1用于突出显示如果您认为对象创建性能是一个问题,那么您不应该使用java ... - Janick Bernet
如果你仔细阅读我的问题,你会发现我不是那个“在这个层面上思考”的人 - 我正在努力创造一个好的设计,但是基于毫无根据的主张,我遇到了阻力。侮辱不赞赏。 - orbfish
@inflagranti FYI在前面引用的书中以及Effective Java中有一整章。我会让你告诉作者他们不应该使用Java;) - orbfish


另外,对于具有许多实例变量的类,会有轻微的性能损失(不确定它是否真的可以测量)。 Java要求每个新实例的每个实例变量都设置为0,false,null,并且存在与将它们设置为零相关联的运行时成本。然而,它可能只是一个快速完成的memset(或calloc或类似的东西)。


1
2017-07-09 23:45





如果有人,我需要参考。

我建议它是 其他开发者 谁应该被要求提供支持他荒谬的主张。


0
2017-07-12 06:55



我刚刚开始。也许及时...... - orbfish
只是玩愚蠢。说'真的吗?它在哪里说呢?怎么可能有用?为什么额外的方法在对象实例化时会花费更多?' - user207421