【问题标题】:Is there a per-method cost to object instantiation in Java?Java中的对象实例化是否有每个方法的成本?
【发布时间】:2010-07-09 22:35:20
【问题描述】:

我从另一位开发人员那里听说,一个对象的重复实例化成本太高,因为“它有一堆方法”。

我的理解(主要来自 Bloch)是,对象创建的成本很高,主要是通过在构造函数中显式完成的事情,尤其是创建其他昂贵的对象。

Java 中的新对象是否有每个方法的成本?我不认为,但如果有人有参考资料,我需要参考资料。

谢谢!

【问题讨论】:

  • 我建议创建一个没有方法的类和另一个有 100 个方法的类,然后计算将每个类实例化一百万次左右所需的时间。然后再做几次以确保。 (我的下意识的反应是不,方法没有影响。但不要相信我的话。)
  • 我需要为这种事情创建一些时序测试器。已经有了吗?另一个SO问题....

标签: java


【解决方案1】:

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

值得一读的还有object creation from the performance tuning book的章节。

【讨论】:

  • "...在第一次实例化时最多只有一次性成本"。实际上,成本是在类加载时产生的。
  • 感谢您的回答。这本书看起来有点过时了,但我正在看。
  • @Stephen C,这可能取决于使用的 VM 以及 JIT 的工作方式。这就是我写“至多”的原因——它可能会延迟加载类,并且类可能加载得很晚,基本上是由它们的实例化触发的。
【解决方案2】:

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

说真的,如果您有这种想法,那么您不应该使用 Java 之类的语言,请使用汇编程序或“C”来编写您的应用程序。

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

【讨论】:

  • +1 强调如果您认为对象创建性能是一个问题,那么您不应该使用 java...
  • 如果你仔细阅读我的问题,你会发现我不是“在这个层面思考”的人——我正在努力创造一个好的设计,但我遇到了阻力毫无根据的主张。侮辱不被欣赏。
  • @inflagranti 仅供参考,在前面引用的书中有一整章,在 Effective Java 中也有。我会让你告诉作者他们不应该使用 Java ;)
【解决方案3】:

顺便说一句,对于具有许多实例变量的类来说,性能会受到轻微影响(但不确定它是否真的可以测量)。对于每个新实例,Java 要求将每个实例变量设置为 0、false、null,并且将它们设置为零会产生运行时成本。然而,它可能只是一个快速完成的 memset(或 calloc 或类似的东西)。

【讨论】:

    猜你喜欢
    • 2018-02-13
    • 2015-03-01
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-29
    • 1970-01-01
    • 2012-03-19
    • 2023-04-09
    相关资源
    最近更新 更多