位运算与乘除运算的对比实验

Java 的JDK中存在很多位运算的使用,其目的是为了让代码跑的更快一些,我们做一个实验,看看到底可以节省多少计算时间。

以下代码中,分别使用了乘除运算和位运算来进行了一亿次基础操作,并打印了所消耗的时间。

/**
 * 比较乘除运算和位运算时间消耗上的差距
 */
public class TestBitOpr {
    public static void main(String[] args){
        int j = 10;
        long start = System.currentTimeMillis();
        for (int i=0;i<10000000;i++){
            if(i % 2 == 0) {
                for(int k=0;k<10;k++){
                    j = j*2;
                }
            } else {
                for(int k=0;k<10;k++){
                    j = j/2;
                }
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("j="+j+"乘除运算花费时间:" + (end - start) + "ms");

        j = 10;
        start = System.currentTimeMillis();
        for (int i=0;i<10000000;i++){
            if(i % 2 == 0) {
                for(int k=0;k<10;k++){
                    j = j<<1;
                }
            } else {
                for(int k=0;k<10;k++){
                    j = j>>1;
                }
            }
        }
        end = System.currentTimeMillis();
        System.out.println("j="+j+"位运算花费时间:" + (end - start) + "ms");
    }
}

1. 在我笔记本上执行以上代码,得到的时间如下:

j=10乘除运算花费时间:548ms
j=10位运算花费时间:115ms

2. 在移动设备上执行此代码,得到的时间如下:

j=10乘除运算花费时间:3544ms
j=10位运算花费时间:928ms

总结:

在大计算量的情况下,位运算可以大大节省CPU时间,乘除运算的消耗时间是位运算的3.5~5倍。

移动设备上消耗的时间是的PC上的7~10倍,可以看出移动设备的CPU跟电脑CPU的差距还是比较大的,在移动设备上时间的节省也预示着电池可以用的更久,所以移动设备上更需要优化的比较好的代码。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 10:35:43

位运算与乘除运算的对比实验的相关文章

算法学习 - 递归与非递归,位运算与乘除法速度比较

递归调用非递归调用 运行时间比较 结论 位运算与乘除法 结论 递归调用/非递归调用 我们都知道,很多算法,都是用递归实现的.当然它们同时也是可以用非递归来实现. 一般我们在对二叉树进行遍历的时候,还有求斐波那契数的时候,递归是非常简单的.代码容易懂,好实现. 但是递归的时候,有一个问题,就是需要压栈.为什么要压栈呢?因为当我在函数内部调用自身的时候,要中断当前的操作继续跳转到下一次的实现,而当前运行的状态要保存起来.所以就把当前状态进行压栈,等到运行到递归条件结束的时候,再弹栈. 所以递归就是需

C++ 出现bug :二位数组的操作运算,求非对角线的元素的和

编写一个通用程序,求出二位数组(行数和列数必须相等)的非对角线的元素之和,试建立类MATRIX完成上述功能 #include<iostream> using namespace std; class MATRIX { public: void mATRIX(); void MATRIX_sum(); void MATRIX_display(); static int fact_len;//定义静态变量 private: int sum; int a[40][40]; }; int MATRIX

C/C++ 移位计算代替乘除运算

测试移位和乘除的比较,发现移位比乘除运算快一个位数的速度,但是难点在于判断是否是2的幂次级的数,如果不是还得通过代码拆分到2的幂次+上分子的累和,然后通过移位得到2的次幂数这样; 下列代码只是简单的判断是幂级数则移位运算,不是则正常计算,不是完全都是移位算,(之后如果找到方法判断更快在更新) C/C++: 1 #include <iostream> 2 3 4 5 uint64_t Multiply_Dived(uint64_t member, uint64_t denominator, ch

256位NIST素域椭圆曲线运算优化细节之一(单个素数p的加减法)

在素域椭圆曲线运算过程中,256位加法和减法运算结果常常位于区间[0,p)之外的情形,需要做+p或是-p的运算 256位NIST素域椭圆曲线参数p的生成公式为: p = 2^256 ? 2^224 + 2^192 + 2^96 ? 1 按照符号将此式分解得: p = (2^256 + 2^192 + 2^96) - (2^224 + 1) 转化为16进制并按64位分节,变成下面的形式: +: 0000000000000001 0000000000000000 0000000100000000 0

使用 &amp; ^ &lt;&lt; 等 位符实现加法运算

学习过C语言的同学都知道,再写代码的时候,位操作运算总比算数运算操作快, 本文就是用C语言提供的位运算实现两个数的加法. 本文使用的代码都经过调试正常并且能够运行,调试环境centos     gcc  一下是实现代码,以及测试结果: #include<stdio.h> #include<stdlib.h> int main(int argc, char **argv) { int add_a,add_b; int sum; if(3!=argc) printf("usa

学习 opencv---(10)形态学图像处理(2):开运算,闭运算,形态学梯度,顶帽,黒帽合辑

上篇文章中,我们重点了解了腐蚀和膨胀这两种最基本的形态学操作,而运用这两个基本操作,我们可以实现更高级的形态学变换. 所以,本文的主角是OpenCV中的morphologyEx函数,它利用基本的膨胀和腐蚀技术,来执行更加高级的形态学变换,如开闭运算.形态学梯度."顶帽"."黑帽"等等. 第二件事,是浅墨想跟大家做一个关于OpenCV系列文章的书写内容和风格的思想汇报. 是这样的,浅墨发现最近几期写出来的文章有些偏离自己开始开这个专栏的最初的愿望--原理和概念部分占的

图像开运算和闭运算

1.原理 图像开运算与闭运算与膨胀和腐蚀运算有关,由膨胀和腐蚀两个运算的复合与集合操作(并.交.补等)组合成的运算构成.开运算与闭运算依据腐蚀和膨胀演变而来. 1)开运算:先对图像腐蚀后膨胀. A○S= (AΘS)⊕ S 作用:用来消除小的物体,平滑形状边界,并且不改变其面积.可以去除小颗粒噪声,断开物体之间的粘连. 2)闭运算:先对图像膨胀后腐蚀 A●S= (A⊕S)Θ S 作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积. 2.开运算的实现 imgP

python开发基础:三元运算&amp;生成式&amp;成员运算&amp;解压法&amp;队列堆栈&amp;数据类型转换

一,三元运算&生成式&成员运算&解压法&队列堆栈&数据类型转换,都在一个code里 1 #!/usr/bin/env python 2 #_*_coding:utf-8_*_ 3 4 #三元运算 5 #if条件成立的结果 if 条件 else else条件成立的结果 6 #原来逻辑 7 # a,b=10,20 8 # if a > b: 9 # c = 5 10 # else: 11 # c = 10 12 # print(c) 13 #三元逻辑 14 # a

三木运算,三元运算

三木运算,三元运算 name = 值1 if 条件 else 值2 深拷贝浅拷贝 str创建一个值不能修改,如果修改在,创建一个 对于int和str 赋值,深拷贝,浅拷贝地址是不变的 对于dict,list,tup 浅拷贝仅拷贝最外层 深拷贝是除了最内层都拷贝 函数 动态参数 万能参数 *arges **kwarges 局部变量和全局变量 全局 大写 修改,global 局部 小写,仅在代码中执行