关于if和位运算比较的测试代码

本着学习严谨的态度,非常疑惑因此自己动手写了一下,进行测试

改编于沉默王二的一篇博客点我传送原文地址

如果进行Arrays.sort(data);排序

        /**
         * @author 沉默王二,一枚有趣的程序员
         */
        // 声明数组
        int arraySize = 32768;
        int data[] = new int[arraySize];

        Random rnd = new Random();
        for (int c = 0; c < arraySize; ++c) {
            data[c] = rnd.nextInt() % 256;
        }
        Arrays.sort(data);
        for (int i = 0; i < 10; i++) {
            // 测试
            long sum = 0;
            long start = System.nanoTime();
            for (int c = 0; c < arraySize; ++c) {
                if (data[c] >= 128) {
                    sum += data[c];
                }
            }
            long end = System.nanoTime();
            System.out.println(end - start);
            System.out.println("sum = " + sum);
            // 测试
            long sum1 = 0;
            long start1 = System.nanoTime();

            // 循环
            for (int c = 0; c < arraySize; ++c) {
                int t = (data[c] - 128) >> 31;//留下了符号位,用于判断 data[c] 是否 > 128
                sum1 += ~t & data[c];//
            }
            long end1 = System.nanoTime();
            System.out.println((end1 - start1));
            System.out.println("sum1 = " + sum1);
            System.out.println();

        }

得到的数据结果

474300
sum = 1568712
801300
sum1 = 1568712

212900
sum = 1568712
106100
sum1 = 1568712

246200
sum = 1568712
257100
sum1 = 1568712

194200
sum = 1568712
278200
sum1 = 1568712

209000
sum = 1568712
235600
sum1 = 1568712

192500
sum = 1568712
256500
sum1 = 1568712

213500
sum = 1568712
234900
sum1 = 1568712

189600
sum = 1568712
365200
sum1 = 1568712

196300
sum = 1568712
234400
sum1 = 1568712

227300
sum = 1568712
403100
sum1 = 1568712

如果不经过Arrays.sort(data);

将上面的这行代码注释即可
得到的结果:

539400
sum = 1539769
880300
sum1 = 1539769

568200
sum = 1539769
100600
sum1 = 1539769

2216100
sum = 1539769
227200
sum1 = 1539769

356900
sum = 1539769
260600
sum1 = 1539769

272000
sum = 1539769
223000
sum1 = 1539769

262700
sum = 1539769
222300
sum1 = 1539769

295300
sum = 1539769
223600
sum1 = 1539769

326300
sum = 1539769
232100
sum1 = 1539769

264700
sum = 1539769
217200
sum1 = 1539769

381000
sum = 1539769
234800

从这两种测试数据来看,经过排序后的数组通过if判断消耗的时间会更少
如果不经过排序,则直接位运算效率效率更高
之所以排序后的数组会更快是因为它进行if判断,而if判断的效率非常的高,也就省去了前面不符合条件的sum+=data[i]
而位操作,则每一个数据都需要进行位操作,也就是说所有数据都需要进行位操作。

两者的时间差在于排序后的数据 if省去了不符合条件的时间
位操作应该比+=效率更高,但是每一个数都进行位操作运算就相当于n个数* 位运算t1
大于
k个数(k


总结

位运算的确比+法效率高,但并不能说位操作就能替代if判断作用,得根据场景选择适合得算法。

你可能感兴趣的:(java)