if...else 影响程序效率
为什么排序后反而运行更快呢?
排序后求和耗时3秒
未排序求和,耗时9秒
// 声明数组
int arraySize = 32768;
int[] data = new int[arraySize];
Random rnd = new Random(0);
for (int c = 0; c < arraySize; ++c) {
data[c] = rnd.nextInt() % 256;
}
// 排序后,比没有排序要快!!!!!!!!!
Arrays.sort(data);
// 测试
long start = System.nanoTime();
long sum = 0;
for (int i = 0; i < 100000; ++i) {
// 循环
for (int c = 0; c < arraySize; ++c) {
// 注意这个if条件,影响执行效率的原因
if (data[c] >= 128) {
sum += data[c];
}
}
}
System.out.println((System.nanoTime() - start) / 1000000000.0);
System.out.println("sum = " + sum);
}
解释
- 代码里的if多了会影响性能,但通常没有想象地大
- 无论是if else,还是for,还是while,还是switch,到了CPU机器码层面,其实都是条件跳转,并没有什么太大的区别
- CPU存在
分支预测
这样的功能,猜对的情况下能避免性能的损失,但是如果处理器猜错了,那么不但不能减少损失,还会浪费已经执行的指令,预测通常能达到 90% 以上的命中率 - 所以,排序后的数据在遇到分支预测的时候,能够轻松地过滤掉 50% 的数据
- 当我们在用到 if 条件分支的话,尽量先对数据进行排序,好加快 CPU 的预测;同时,我们在代码中应该尽量少用 if 条件分支,以免影响程序的执行效率,可以用位运算的方式替代。
你要是觉得写的还不错,就点个关注,可以评论区留下足迹,以后方便查看.
你要是觉得写的很辣鸡,评论区欢迎来对线!
欢迎转载!