首页 > 解决方案 > 如何处理重复测试的持续时间并计算它们的平均时间

问题描述

根据这个主题:Collectors.mapping 与传统 Stream.map

我决定进行自己的临时测试用例,以找出操作之间的大致性能Collectors.mapping差异Stream.map。结合上述内容,我创建了两个辅助方法,它们将为我的假容器提供 stab 数据。

  private List<Employee> dataStab() {
    List<Employee> employees = new ArrayList<>();

    for (int i = 0; i < 10000000; i++) {
      Employee employee = randomizeEmployeeParam();
      employees.add(employee);
    }
    return employees;
  }

  private Employee randomizeEmployeeParam() {

    return
        new
            Employee(
            "Employee" + rand.nextInt(3000),
            rand.nextInt(50),
            1000 + (10000 - 1000) * rand.nextDouble());
  }

我创建了两个相应地进行的测试Collectors.mappingStream.map操作。

  @RepeatedTest(10)
  void collectorsMapping() {
    Instant start = Instant.now();
    List<String> strings = employeeService.collectorsMapping(dataStab());
    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();
    System.out.println(timeElapsed);
    assertEquals(10000000, strings.size());
  }

  @RepeatedTest(10)
  void streamMapAndCollect() {
    Instant start = Instant.now();
    List<String> mapAndCollect = employeeService.streamMapAndCollect(dataStab());
    Instant finish = Instant.now();
    long timeElapsed = Duration.between(start, finish).toMillis();
    System.out.println(timeElapsed);
    assertEquals(10000000, mapAndCollect.size());
  }

到目前为止测试工作,但现在我想根据 IntelliJ 运行窗口中的结果手动计算这些测试的平均时间。此外,从长远来看,如果我会增加@RepeatedTest参数来计算最接近的结果,这将有点乏味。我想知道是否可以处理持续时间参数timeElapsed并计算 n 次重复测试的平均值。

标签: javajunitduration

解决方案


如果我理解正确,您正在尝试对执行相同操作的两种不同方法进行基准测试。
执行基准测试可能很棘手,尤其是在确保测试期间条件保持不变时。
例如,JVM 可能会在一段时间后开始优化某些操作。
进行此类测试的最佳工具可能是 JMH ( https://openjdk.java.net/projects/code-tools/jmh/ )。


推荐阅读