当前位置: 首页 > 知识库问答 >
问题:

为什么第一次调用构造函数的时间是其他构造函数的10倍?

夔高寒
2023-03-14
class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
      new testx();
      new testx();
      new testx();
  }
}

我总是得到与此类似的结果7806660517。为什么第一个电话比其他电话要花10倍的时间?

共有2个答案

常雅珺
2023-03-14

它肯定是路易斯·乏色曼,它需要更长的第一轮,因为它必须加载所有必要的System类,你可以通过在创建类的新实例之前调用一个空白的println()来解决这个问题,因为看看我们这样做会发生什么:

public class testx
{
  public testx()
  {
    long startTime = System.nanoTime();
    System.out.println((System.nanoTime() - startTime));
  }

  public static void main(String args[])
  {
    //loads all System.* classes before calling constructor to decrease time it takes
    System.out.println();
      new testx();
      new testx();
      new testx();
  }
}

输出:

405 0 405

其中,作为初始代码输出:

7293 0 405

姬俊远
2023-03-14

因为JVM第一次加载了一堆o’类。一旦那第一个系统。nanoTime()返回,您已经加载了系统。类testx。类,但一次为系统。出来println出现在图片中,我怀疑有很多I/O类被加载,这需要一些时间。

无论如何,这不是一个好的基准测试技术;在开始测量JIT之前,您应该运行大约10000次迭代来预热JIT。或者(最好),使用预先构建的基准测试工具,如卡尺。

 类似资料:
  • 问题内容: 我在Java中使用多个构造函数时遇到麻烦。 我想做的是这样的: 但是我不能,因为第二个构造函数不能调用另一个构造函数,除非它是第一行。 这种情况的常见解决方案是什么?我无法“在线”计算arg2和arg3。我以为也许可以创建一个构造助手方法来完成实际的构造,但是我不确定这是否“漂亮”…… 编辑 :由于我的某些字段是最终的,因此使用辅助方法也是有问题的,我无法使用辅助方法进行设置。 问题答

  • FAQs in section [10]: [10.1] 构造函数做什么? [10.2] List x; 和 List x();有区别吗? [10.3] 如何才能够使一个构造函数直接地调用另一个构造函数? [10.4] Fred 类的默认构造函数总是 Fred::Fred()吗? [10.5] 当我建立一个 Fred 对象数组时,哪个构造函数将被调用? [10.6] 构造函数应该用“初始化列表”还

  • 如果将移到构造函数的最后一行,我不明白为什么下面的代码会显示错误。 我已经检查了很多关于StackOverflow的答案,但我仍然不能理解这其中的原因。请帮我用一些简单的例子和解释弄清楚这个错误。

  • 这个Super()的替代品是什么;我代码中的语句...因为它向我显示了一个名为:构造函数调用必须是构造函数中的第一个语句的错误。

  • 本文向大家介绍请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?相关面试题,主要包含被问及请解释Java中的概念,什么是构造函数?什么是构造函数重载?什么是复制构造函数?时的应答技巧和注意事项,需要的朋友参考一下 考察点:JAVA构造函数 当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有给类提供构造函数的情况下,Java编译器会为这个类创建一

  • 问题内容: 在Java的构造函数中,如果要调用另一个构造函数(或超级构造函数),则它必须是该构造函数的第一行。我认为这是因为不允许您在其他构造函数运行之前修改任何实例变量。但是,为什么不能在构造函数委派之前使用语句,以便计算另一个函数的复杂值?我想不出任何正当的理由,在一些实际案例中,我编写了一些丑陋的代码来解决此限制。 所以我只是想知道: 有此限制的充分理由吗? 有没有计划在将来的Java版本中