博客
关于我
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/

你可能感兴趣的文章
openshift搭建Istio企业级实战
查看>>
OpenSLL
查看>>
Openssh Openssl升级
查看>>
openssh 加固
查看>>
OPENSSH升级为7.4
查看>>
ViewPager切换滑动速度修改
查看>>
OpenSSL 引入了新的治理模式和项目,来增强社区参与和决策
查看>>
openssl内存分配,查看内存泄露
查看>>
OpenSSL创建SSL证书
查看>>
openssl在cygwin下编译错误:CPU不支持x86_64(CPU you selected does not support x86-64 instruction set )
查看>>
openssl安装
查看>>
openssl安装
查看>>
OpenSSL生成root CA及签发证书
查看>>
Openstack CLI命令管理私有云主机实战(附OpenStack实验环境)
查看>>
openStack instance error 恢复
查看>>
openstack instance resize to
查看>>
openstack message queue
查看>>
openStack openSource CloudComputing
查看>>
Openstack REST API
查看>>
OpenStack ussuri 私有云平台搭建企业级实战
查看>>