位运算效率高还是位运算效率高?

在《java程序性能优化》中写到,位运算是运算中最高效的,而我依照书上的代码运行了一遍
发现并不是这样。

补上代码:

public class BitOperate {

public static void main(String[] args) {
    nomal();
    bit();
}

private static void nomal() {
    long start =System.currentTimeMillis();
    long a = 100;
    for (int i = 0; i < 100000000; i++) {
        a*=2;
        a/=2;
    }
    System.out.println("nomal total used:"
            + (System.currentTimeMillis() - start) + "ms");
}

private static void bit() {
    long start =System.currentTimeMillis();
    long a = 100;
    for (int i = 0; i < 100000000; i++) {
        a<<=1;
        a>>=1;
    }
    System.out.println("bit total used:"
            + (System.currentTimeMillis() - start) + "ms");
}

}

输出:

nomal total used:1ms
bit total used:3ms

望能解惑

0

5个回答

这和你机器当时的运行状态有关系,不代表实际情况,看我的测试结果

nomal total used:1864ms
bit total used:771ms

0
zuolovefu
左VJ 谢谢~
接近 4 年之前 回复

在很快的设备上,由于操作系统会进行任务调度,因此很多未知因素会导致出现偏差,要想真正准确测试,应该在单任务操作系统甚至裸机上测试,,
但位运算快是毫无疑问的
在手机上的arm处理器上,就比较明显了,如图:图片

0

和你的机器有关,但位运算确实是最快的

0

nomal total used:109ms
bit total used:8ms

0

我用你的代码测试结果是
nomal total used:321ms
bit total used:25ms
而你的都是1ms,3ms这些看起来几乎可以忽略不计的时间量。
所以可能是你的机子的确比我的快很多,然后100000000对于来说,差距不明显。
System.currentTimeMillis()本来就是精确到ms级别的,理论上误差<±1ms。
另外系统的运行状态存在不一样,算做存在干扰因素。
1ms的精度级别上,1ms和3ms的时间比较,干扰因素带来的干扰就比较大了。
另外,你的直接就1ms和3ms感觉比我的机器不要快太多了,加上你的a变量实际上没有用作其它用途,并且乘以2再除以2感觉更是多余,我不知道是不是你的“java编译器”自动把这个操作给优化掉了。好吧,java编译器已经暴露了我是个对java不太熟悉的家伙。所以这个仅仅是猜测。
另外下面是我把循环里的操作以及把循环去掉(代码如下)后再次运行结果:

nomal total used:315ms
bit total used:22ms
kkk total used:4ms
ddd total used:0ms

从这个结果可以看到与第一次运行结果(321ms,25ms)相比时间有了波动。

nomal total used:316ms
bit total used:26ms
kkk total used:5ms
ddd total used:0ms

nomal total used:314ms
bit total used:24ms
kkk total used:5ms
ddd total used:0ms

如上,可以很明显的看到时间波动几ms是有非常的可能的

另外,如果我的机子和你的性能相差不是很大的话,你的时间可能比较接近与自动把里面的a的运算优化掉了的时间(kkk)
当然,可能只是我的机子太老了才这么逊。(╥╯^╰╥)嘤嘤嘤

public class BitOperate {

public static void main(String[] args) {
    nomal();
    bit();
    kkk();
    ddd();
}

private static void nomal() {
    long start =System.currentTimeMillis();
    long a = 100;
    for (int i = 0; i < 100000000; i++) {
        a*=2;
        a/=2;
    }
    System.out.println("nomal total used:"
            + (System.currentTimeMillis() - start) + "ms");
}

private static void bit() {
    long start =System.currentTimeMillis();
    long a = 100;
    for (int i = 0; i < 100000000; i++) {
        a<<=1;
        a>>=1;
    }
    System.out.println("bit total used:"
            + (System.currentTimeMillis() - start) + "ms");
}

    private static void kkk() {
        long start =System.currentTimeMillis();
        long a = 100;
        for (int i = 0; i < 100000000; i++) {
        }
        System.out.println("kkk total used:"
                + (System.currentTimeMillis() - start) + "ms");
    }
    private static void ddd() {
        long start =System.currentTimeMillis();
        long a = 100;

        System.out.println("kkk total used:"
                + (System.currentTimeMillis() - start) + "ms");
    }

}
0
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
使用位运算计算LOG2
使用位运算计算LOG2,二进制数字是非常神秘的,利用二进制的位运算可以加速很多复杂的操作
lua进行位运算的文件,直接调用
lua位运算,接口在bit2.lua文件中,还有64位数字处理,方便调用
C#位运算及运算符
0、逻辑运算符 1、位逻辑非运算 2、位逻辑与运算 4、位逻辑异或运算 5、位左移运算 6、位右移运算
位运算简介及实用技巧
位运算简介及实用技巧.位运算简介及实用技巧.位运算简介及实用技巧.位运算简介及实用技巧.
Java中的位运算
Java的位运算
异或位运算加密
通过异或位运行进行加密,算法可公开,保存好key就行
c++位运算c++位运算
c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算c++位运算
C#枚举中的位运算
C#枚举中的位运算,本程序是用于在经C#枚举中的位运算,使你轻松了解到程序的应用。
c++位运算讲解及代码
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二进制是1011,那么6 and 11的结果就是2,它是二进制对应位进行逻辑运算的结果(0表示False,1表示True,空位都当0处理)。
lua中2进制位运算算法总结
2进制lua中的一些简单算法,希望大家好好学习啊,很有用的
JAVA中位运算符合移为运算符
NULL 博文链接:https://zhangwei-2943-163-com.iteye.com/blog/1536148
数组位运算求任意区间内素数的个数
超高速的素数筛选方法,与一般的筛法不同的是本代码使用的是基于数组中的位运算
C# 位运算 判断是否为2的N次幂
从键盘输入一个数判断该数字是否是2的N次幂 用位运算的方法实现
java位运算.docx
java位运算.docxjava位运算.docxjava位运算.docxjava位运算.docx
c语言位运算c语言位运算
c语言位运算c语言位运算c语言位运算c语言位运算c语言位运算
Java 中的位运算 .doc
Java 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .docJava 中的位运算 .doc
C语言位运算
C语言位运算 C语言位运算 C语言位运算 C语言位运算 C语言位运算
回归本源——位运算及其应用
摘自2014国家集训队论文《回归本源——位运算及其应用》,详细描述了位运算的众多巧妙用法,对于位运算的深入运用可以参考。
Labview的运行效率
Labview的运行效率
位运算大全
位运算大全 位运算详解 位运算实例 适合嵌入式开发
hive udaf 实现按位取与或
hive udaf 实现按位取与或 hive udaf 实现按位取与或 hive udaf 实现按位取与或
SQLite 和Access 效率比较工具
Sqlite 和Acces 各个性能比较(包括创建数据库、新建表,大数据量插入时的速度和效率等)
韩顺平位运算
适合初学者认识位运算,更好的学好位运算,认识到位运算
基于as3的位运算详解
本人总结的基于as3.0的位运算详解。本人总结的基于as3.0的位运算详解。本人总结的基于as3.0的位运算详解。本人总结的基于as3.0的位运算详解。本人总结的基于as3.0的位运算详解。
位运算.pdf
有关 位运算 的简介
位运算15个完整优秀实例 计算机系统2
欢迎下载学习,主要是关于计算机系统的底层位运算。有详细的解释
AES和DES效率比较
两个加密算法的性能及效率比较。运用c和C++对数据加密标准和高级加密标准进行实现。这是算法的简单实现。
java多线程并发编程例子
关于java.util.concurrent多线程核心包内各种线程资源的使用场景例子
低效的C++真是这样吗——C++的效率分析
C++可以为嵌人式编程人员提供一些优于C语言的显著特点。在刚开始,C++可以简单的作为一个更好的C使用:正如一些C编程者用C++编译器运行代码进行质量检验。这也表明,转向使用C++所带来的利弊并不是绝对的:正如本文所述,你可以选择一些对应用有用的C++功能,而不要其他功能。相比于C, C++更加强大的类型检验可以在编译时发现更多的错误,实现精确的内存控制和开发出更紧凑的执行代码。改用面向对象的方法可以提供更好的调试和维护代码的功能 但是除了这些公认的优点之外,在C语言编程者中似乎存在这样一个普遍的感觉,那就是编写同样的应用代码C++比C低效。诸如此类常识,不见得是正确的:效率的高低取决于你使用了哪些C++功能和如何使用这些功能。
oracle解决游标多维度循环查询效率过低方案
多维度查询时通常需要建立多个游标循环,查询效率无法得到保障,现在通过游标和substr()函数相结合的方式提高查询效率
位运算学习
这个文档有助于理解c语言中的位运算,便于大家学习
JAVA位运算.pdf
JAVA位运算.pdf ,深入了解java位运算
oracle位运算
oracle位与或等比特运算的一些操作说明
一个c语言 位运算 的程序
一个c语言 位运算 的程序一个c语言 位运算 的程序一个c语言 位运算 的程序
算法心得-高效算法的奥秘(原书第2版)_带书签_高清_[位运算的奇技淫巧].pdf
算法心得-高效算法的奥秘(原书第2版)_带书签_高清_[位运算的奇技淫巧].pdf.
N皇后问题(位运算,C语言版)
N皇后问题(位运算,C语言版) N皇后问题求解 位运算
vb位运算(调用vc的dll实现)含源代码
vb位运算(调用vc的dll实现)含源代码 vb位运算(调用vc的dll实现)含源代码 vb位运算(调用vc的dll实现)含源代码 vb位运算(调用vc的dll实现)含源代码
关于全排列算法
关于全排列算法。。。。
IO流梳理--及效率分析
IO梳理
经典的位运算合集 Matrix67及总结
【转载】常用位操作 位运算应用口诀 常用位操作 几个常用的位操作 计算树状数组lowbit的三种方法 统计一个整数的二进制中1的个数(位运算技巧) 收藏 统计一个整数的二进制中1的个数的三种方法 位运算讲稿_by_Matrix67 位运算之美——用+,-和位运算实现正整数除法和取模(二) 位运算之美——用+,-和位运算实现正整数除法和取模(一) 位运算总结 收藏 位运算总结 用位运算求整数的绝对值的三种方法
文章热词 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型 设计制作学习
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java如何学习效率高 学习java怎么样效率高