代码之家  ›  专栏  ›  技术社区  ›  biasedbit

Java中新运算符与NeWistStand()的性能

  •  10
  • biasedbit  · 技术社区  · 16 年前

    我在用 newInstance() 在我的代码的一个关键性能领域。 方法签名为:

    <T extends SomethingElse> T create(Class<T> clasz)

    我通过 Something.class 作为论据,我得到了 SomethingElse 创建的 NeWestStand() .

    今天我又把这个性能从列表中清除了,所以我运行了几个测试 new 算子对 NeWestStand() . 我对他的表现非常惊讶 NeWestStand() .

    我在这里写了一点: http://biasedbit.com/new-vs-newinstance/

    (对自我提升感到抱歉…我会把文本放在这里,但这个问题会变得不协调。)

    我想知道的是为什么 -server 当正在创建的对象数量大幅增长而不是“低”值(例如100或1000)时,标志提供了这样的性能提升。

    我确实从整个反射中吸取了教训,这只是对JVM在运行时执行的优化的好奇,特别是对 -服务器 旗帜。另外,如果我在测试中做了一些错误的事情,我会感谢你的反馈!


    编辑:我添加了一个预热阶段,结果现在更稳定了。感谢您的输入!

    3 回复  |  直到 13 年前
        1
  •  5
  •   Stephen C    16 年前

    我确实从整个反射中吸取了教训,这只是对JVM在运行时执行的优化的好奇,尤其是对-server标志的优化。另外,如果我在测试中做了错误的事情,我会感谢你的反馈!

    首先回答第二部分,您的代码似乎是Java微基准的经典错误,而不是在进行测量之前“热身”JVM。您的应用程序需要运行进行测试的方法几次,忽略前几次迭代…至少在数字稳定之前。这是因为JVM必须做大量工作才能启动应用程序;例如,加载类和(当它们运行了几次)JIT编译花费大量应用程序时间的方法。

    我认为“-server”之所以与众不同是因为它改变了决定何时进行JIT编译的规则。假设对于一个“服务器”,最好更快地进行JIT,这样可以使启动速度变慢,但吞吐量更好。(相比之下,“客户机”被调到延迟JIT编译,以便用户更快地获得一个工作的GUI。)

        2
  •  1
  •   Daniel Voina    16 年前

    imho性能惩罚来自于类加载机制。 在反射的情况下,所有的安全机制都被使用,因此创造惩罚更高。 对于新的操作符,类已经加载到vm中(由默认的类加载器检查和准备),实际的实例化是一个便宜的过程。 -server参数对常用代码进行了大量的JIT优化。您可能还希望使用-batch参数来尝试它,该参数会抵消启动时间,但代码运行速度会更快。

        3
  •  1
  •   trashgod    16 年前

    除其他外,还包括 -server 选项有显著不同 survivor space sizing 默认值。

    仔细阅读,我发现你的例子是 micro-benchmark 结果可能与直觉相反。例如,在我的平台上,重复调用 newInstance() 在重复运行期间有效优化,使 NeWestStand() 出现的速度比 new .