0

有谁知道在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
4

3 回答 3

2

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

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

于 2010-12-02T21:20:52.247 回答
1

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

于 2010-12-02T21:23:40.247 回答
1

我可以向您保证 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;
于 2010-12-02T21:39:36.830 回答