2010-12-02 37 views
0

有没有人知道在java(顺序和fork连接)中分类排序算法的好方法? 因为运行时间太短(排序列表大小5000 ..),System.nanoTime()似乎无法正常工作。我打算多次运行相同的测试用例(1000),并摆脱前100个结果(避免HotSpot编译器问题),并使用System.nanoTime()来平均运行时间。 对此有何建议?配置文件java并行/顺序排序

非常感谢!

我可以这样做吗?

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 

回答

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; 
+0

您的意思是10K次排序相同的列表或摆脱第一个10k运行结果?谢谢 – Ang 2010-12-02 22:05:39

2

如果现实世界的运行时间太短而不能进行基准测试,那么优化它可能是不值得的。

如果您只是对5000个元素进行排序,那么最好使用最简单的解决方案,而不是过早地优化它。如果你的名单显着较大,那么你应该在这些大型名单上进行基准比较,而不是较小的名单。

+0

如果我需要这样的信息,你知道任何好的方法吗?谢谢 – Ang 2010-12-02 22:06:04

1

从排序较大的列表开始。如果您试图比较基准时间,我认为50,000,000个元素更合理。