Java junit测试用例的执行时间每次都不同。为什么?

Java junit测试用例的执行时间每次都不同。为什么?,java,performance,junit4,performance-testing,Java,Performance,Junit4,Performance Testing,我有一套196测试方法。每次运行测试用例时,这些测试用例的执行时间都会有所不同。它是在受控环境中运行的,比如说,为了垃圾收集,我在teardown()中包含了null 每次执行测试之前,我还要确保每次启动时CPU使用率、内存使用率、磁盘空间和系统负载都相同 此外,时间变化不是以任何特定顺序进行的。我需要知道为什么我们不在再次执行相同的测试用例时得到s表执行时间 通过在课堂上进行热身,我使93个病例稳定下来。其他情况与数据库连接有关(读取数据库中的数据或更新数据库中的数据)。每次运行这些测试用例时

我有一套196测试方法。每次运行测试用例时,这些测试用例的执行时间都会有所不同。它是在受控环境中运行的,比如说,为了垃圾收集,我在
teardown()
中包含了
null

每次执行测试之前,我还要确保每次启动时CPU使用率、内存使用率、磁盘空间和系统负载都相同

此外,时间变化不是以任何特定顺序进行的。我需要知道为什么我们不在再次执行相同的测试用例时得到s表执行时间


通过在课堂上进行热身,我使93个病例稳定下来。其他情况与数据库连接有关(读取数据库中的数据或更新数据库中的数据)。每次运行这些测试用例时,是否可能有相同的执行时间。(执行时间指junit testcase执行时间)

Java性能需要考虑两个主要因素:

  • 您需要预热JVM,您的测试将被解释为字节码,并受JVM的支配。这意味着在同一次运行中执行同一测试数千次以上
  • JUnit测试的测量精度不高。事实上,要获得准确的性能读数几乎是不可能的,即使是专门为此构建的库。这就是为什么一般建议取多个样本的平均值
然而,这一点和其他建议正是Java可能导致差异的原因。其中毫秒的差异大于预期值。举个例子,创建一个单元测试,该测试取一个线程并将其休眠10毫秒。当您得到7毫秒到13毫秒到17毫秒或更多的结果时,请注意。这不是一种可靠的衡量方法

如果你连接到一个网络,上传数据到一个数据库,等等。我不能代表这一点,但你需要考虑到这些系统的差异


我建议将三个差异最大的测试分成更小的块。试着找出最大的瓶颈所在,然后集中精力优化该操作或操作集。我认为连接到数据库花费的时间最多,其次可能是执行查询。但您应该隔离这些操作的测量,以确保这一点

还有更多的参数和影响。例如CPU缓存、操作系统缓存等,。。。最好多次重复测试并测量总时间。此主题的强制链接:多少秒中有40秒?另外,当你说“应用服务器的连接”时——这是否会影响到网络?如果它影响到网络,应用服务器的负载也是恒定的吗?您是只使用本地网络还是通过Internet进行通信?即使它只使用本地网络,也可能会受到远程服务器负载/网络负载/交换机负载/路由器负载/…@tps的高度影响。您不应该在注释中写下所有内容。它属于您的问题,请编辑它。