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 条件分支,以免影响程序的执行效率,可以用位运算的方式替代。
posted @ 2021-02-22 11:51  rm-rf*  阅读(670)  评论(0编辑  收藏  举报