博客
关于我
Android开发大神Jake Wharton 提问:除以 2 ,右移 1,谁更好 ?
阅读量:142 次
发布时间:2019-02-27

本文共 1093 字,大约阅读时间需要 3 分钟。

移位操作和乘除法在Android上的性能表现

在Android开发中,选择使用除以2还是右移1,到底该用哪种操作呢?让我带你深入了解这两个操作的性能差异,并帮助你做出最优选择。

1. 移位操作与乘除法的性能对比

移位操作(如左移1位)和乘除法(如除以2)在处理整数时,通常被认为是等价的操作。然而,它们在底层实现上有很大的不同。

  • 移位操作:在移位操作中,左移1位(value << 1)或右移1位(value >> 1)会直接将值的二进制表示左移或右移。这种操作非常高效,因为它只需要简单的位操作,而不需要进行复杂的计算。

  • 乘除法:除以2的操作(value / 2)则需要执行复杂的算术运算。除法运算需要处理运算结果是否为整数,以及如何处理负数的情况。

2. 编译器和运行时的优化

在实际应用中,编译器和运行时环境对这两种操作的优化方式有很大影响。

  • 移位操作:移位操作通常可以被优化为非常高效的指令。例如,在Dalvik字节码中,移位操作只需要加载参数和一个字面量,然后执行移位指令。

  • 乘除法:乘除法通常会生成更多的字节码,特别是当处理负数时。例如,在处理负数时,除法需要额外的指令来确定结果的符号。

3. 实际性能测试

为了更好地了解移位操作和乘除法的性能差异,我进行了实际的性能测试。

  • 测试方法:在Android 10 Pixel3上运行基准测试,分别测量除以2和右移1位的性能。

  • 结果:测试结果显示,移位操作和除法运算的性能差异非常小,通常只有纳秒级别的差距。在大多数情况下,移位操作的性能和除法运算的性能是相当的。

4. 无符号数除法

对于无符号数除法(如Kotlin中的UInt类型),情况有所不同。Kotlin使用内联和优化来处理无符号数除法,但这些优化通常不会转换为移位操作。

  • 优化机会:由于这些优化,除法运算在某些情况下可以比移位操作更高效。但通常情况下,这些优化并不显著。

5. 结论

通过以上分析,可以得出以下结论:

  • 移位操作:在需要按位操作的情况下,移位操作是更高效的选择。
  • 乘除法:在大多数情况下,乘除法和移位操作的性能差异非常小,可以根据具体需求选择。
  • 无符号数除法:对于无符号数除法,除法运算通常比移位操作更高效,但这种优势在大多数情况下并不明显。

6. 实际应用中的建议

在实际应用中,你应该根据具体需求来选择使用移位操作还是乘除法:

  • 严格需要按位操作:使用移位操作。
  • 普通数学运算:使用乘除法。
  • 无符号数除法:尽可能使用Kotlin的内联和优化,而不是移位操作。

通过这些优化,你可以在Android应用中实现更高效的计算,同时保持代码的可读性和简洁性。

转载地址:http://jrzb.baihongyu.com/

你可能感兴趣的文章
Netty工作笔记0011---Channel应用案例2
查看>>
Netty工作笔记0014---Buffer类型化和只读
查看>>
Netty工作笔记0050---Netty核心模块1
查看>>
Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
查看>>
Netty常见组件二
查看>>
netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
查看>>
Netty核心模块组件
查看>>
Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
查看>>
Netty源码—2.Reactor线程模型一
查看>>
Netty源码—4.客户端接入流程一
查看>>
Netty源码—4.客户端接入流程二
查看>>
Netty源码—5.Pipeline和Handler一
查看>>
Netty源码—6.ByteBuf原理二
查看>>
Netty源码—7.ByteBuf原理三
查看>>
Netty源码—7.ByteBuf原理四
查看>>
Netty源码—8.编解码原理二
查看>>
Netty源码解读
查看>>
Netty的Socket编程详解-搭建服务端与客户端并进行数据传输
查看>>
Netty相关
查看>>
Network Dissection:Quantifying Interpretability of Deep Visual Representations(深层视觉表征的量化解释)
查看>>