```java
protected static void test(int[] data, int size) {
int sum = 0;
long start = System.nanoTime();
for (int loop = 0; loop < size; loop++) {
for (int num : data)
if (num < 128) sum += num;
}
long end = System.nanoTime();
System.err.printf("Unsort\t%d\t%d%n", end - start, sum);
}
protected static void testBySort(int[] data, int size) {
int sum = 0;
long start = System.nanoTime();
Arrays.sort(data); // <- 取消这行注释,对比运行结果
for (int loop = 0; loop < size; loop++) {
for (int num : data)
if (num < 128) sum += num;
}
long end = System.nanoTime();
System.err.printf("Sort\t%d\t%d%n", end - start, sum);
}
public static void main(String[] args) {
int[] dataA = new Random().ints(0, 256).limit(65536).toArray();
int[] dataB = new Random().ints(0, 256).limit(65536).toArray();
final int size = 10000; //放大倍率
testBySort(dataA,size);
test(dataB,size);
}
```
这是我的测试代码,因为规模扩大了,我把 sum 改成 long 类型,原来计算大于 128 ,改成计算小于 128 ,在我已经淘汰的老电脑上跑( CPU E7300 ),多次结果差不多是这样的。之所以没有用同一个数组,是因为我试的时候发现用同一个数组,后测试的那个速度会明显加快(可能由于 JVM 内部有缓存或者其他什么优化之类的情况),因此使用了两组不同的数据源。
我觉得 @
mind3x 说的也对。可能这个所谓的分支预测依赖于具体的硬件实现,不同的 CPU 上影响的效果差距较大吧。
无论怎样,这是有一个有意思的测试。
size -> 100000 (数字太大,计时单位为 currentTimeMillis ,其他几组都是 nanoTime )
Sort 15499 207147800000
Unsort 38274 207932200000
size -> 10000
Sort 1908208198 20769020000
Unsort 3788565998 20795440000
size -> 1000
Sort 191129828 2083522000
Unsort 443468946 2084494000
size -> 100
Sort 27209133 207403100
Unsort 39159150 206028200
size -> 10
Sort 21933511 20871060
Unsort 5386091 20815650