【问题标题】:Profile java parallel/sequential sorting配置文件 java 并行/顺序排序
【发布时间】:2023-03-05 10:21:01
【问题描述】:

有谁知道在java中分析排序算法的好方法(顺序和叉连接)? 因为运行时间太短(排序列表大小 5000..),System.nanoTime() 似乎无法正常工作。

我计划多次运行相同的测试用例(1000 次)并去掉前 100 个结果(避免 HotSpot 编译器问题)并使用 System.nanoTime() 计算平均运行时间。 对此有何建议?

非常感谢!

我可以这样做吗?

double count = 0;
double start, end;
for(int r = 0; r < warmup; r++) {
    // do test
}
for(int t = 0; t < runs; t++){
    start = System.nanoTime();
    // do test
    end = System.nanoTime();
    count += start - end;
}
double avg = count/avg

【问题讨论】:

    标签: java sorting fork-join


    【解决方案1】:

    如果实际运行时间太短而无法进行基准测试,则可能不值得对其进行优化。

    如果您只对包含 5000 个元素的列表进行排序,最好采用最简单的解决方案,而不是过早地对其进行优化。如果您的列表要大得多,那么您应该对那些大列表而不是较小的列表进行基准测试。

    【讨论】:

      【解决方案2】:

      我可以向您保证 nanoTime() 确实有效,如果您想避免所有热点预热,您需要运行 10K 次。你应该会发现某种5K元素是相当快的,甚至1K测试也不是很多。您需要编写一个测试来产生可重现的结果。如果你还没有,那就由你来修复测试,因为它不是很好。

      我建议你尝试一下,看看你会得到什么结果。

      在一台旧计算机上,一种 5K 随机 int 值大约需要 500 us。注意:对已排序的数组进行排序不会给您相同的结果。 (所以你不能每次都对同一个数组进行排序)

      忽略前 N 次运行,运行一定次数的测试的简单方法是这样做。

      long start = 0;
      for(int r = -warmup; r < runs; r++) {
          if (r == 0) start = System.nanoTime();
          // do test
      }
      long avg = (System.nanoTime() - start)/runs;
      

      【讨论】:

      • 您的意思是对同一个列表进行 10K 次排序还是去掉前 10k 次运行结果?谢谢
      • 预热可能需要 10K 次迭代。因此,您需要做的不止于此,并丢弃前 10K。但是,在这种情况下,我怀疑,在 1000 次之后,您将非常接近这个结果。无论如何,10K 大约需要 5 秒。
      • double count = 0 for(int r = 0; r
      【解决方案3】:

      首先对更大的列表进行排序。如果您尝试比较基准时间,我会说 50,000,000 个元素更合理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-18
        • 1970-01-01
        • 1970-01-01
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 2018-05-20
        相关资源
        最近更新 更多