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

你可能感兴趣的文章
Oracle学习
查看>>
ui 图片素材网站
查看>>
Oracle学习总结(10)——45 个非常有用的 Oracle 查询语句
查看>>
Oracle学习总结(2)——Oracle数据库设计总结(三大范式)
查看>>
Oracle学习总结(3)——Navicat客户端连接Oracle数据库常见问题汇总
查看>>
Oracle学习总结(4)——MySql、SqlServer、Oracle数据库行转列大全
查看>>
Oracle学习总结(6)—— SQL注入技术
查看>>
Oracle学习总结(7)—— 常用的数据库索引优化语句总结
查看>>
Oracle学习总结(8)—— 面向程序员的数据库访问性能优化法则
查看>>
Oracle学习总结(9)—— Oracle 常用的基本操作
查看>>
oracle学习笔记《二》
查看>>
oracle学习笔记(4)
查看>>
Oracle学习第二天---Profile的使用
查看>>
Oracle学习第五课
查看>>
Oracle安全攻防,你可能不知道自己一直在裸奔
查看>>
Oracle安装、Navicat for Oracle、JDBCl连接、获取表结构
查看>>
Oracle安装与远程连接配置(附Oracle安装包)
查看>>
Oracle官方推荐的性能测试工具!简单、精准又直观!
查看>>
ORACLE客户端连接
查看>>
oracle密码包含,【扫盲】Oracle用户密码含有特殊字符的处理办法
查看>>