Java Integer类中的getChars方法,为什么它使用按位运算而不是算术运算?

标签 java optimization

所以我正在检查Integer的类source code (JDK 8) 了解 int 如何转换为 String。它似乎使用名为 getChars 的包私有(private)方法(第 433 行)将 int 转换为 char 数组。

虽然代码并不难理解,但是有多行代码使用了按位移位运算,而不是简单的算术乘法/除法,例如以下几行代码:

// really: r = i - (q * 100);
r = i - ((q << 6) + (q << 5) + (q << 2));

q = (i * 52429) >>> (16+3);
r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...

我只是不明白这样做的意义,这实际上是一种优化吗?它会影响算法的运行时吗?

编辑:

换句话来说,既然编译器内部做了这种优化,那么手动优化还有必要吗?

最佳答案

我不知道这个具体变化的原因,除非你找到原作者,否则你不太可能找到权威的答案。

但我想回答更广泛的问题,即运行时库中的很多代码(java.*和许多内部包)是优化到的程度对于应用于“正常”应用程序代码来说是非常不寻常的(而且我敢说是不负责任的)。

这基本上有两个原因:

  1. 它在许多不同的环境中被调用很多。如果您的服务器中的方法每天仅在 3 台服务器上执行 50 次(每台服务器各执行 50 次),那么优化服务器中的方法以减少 0.1% 的 CPU 时间是不值得的。但是,如果您可以使 Integer.toString 对于执行它的每个人来说速度提高 0.1%,那么这确实会带来很大的变化。
  2. 如果您在特定虚拟机上优化应用程序代码,那么当编译器决定以不同方式进行优化时,将该虚拟机更新到较新版本可以轻松撤销您的优化。对于 java.* 中的代码,这不是一个问题,因为它总是与运行它的运行时一起提供。因此,如果他们引入了编译器更改,使给定的优化不再是最佳的,那么他们可以更改代码以匹配这一点。

tl;dr java.* 代码通常会被优化到疯狂的程度,因为它是值得的,而且他们可以知道它实际上会工作。

关于Java Integer类中的getChars方法,为什么它使用按位运算而不是算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791304/

相关文章:

javascript - (Node.js+express+MongoDB),如何优化经常使用的变量?

regex - 有没有比我的正则表达式更好的解决方案

c++ - 优化模块化算法的代码

java - 自定义alertdialog android api 10

Java Fx自定义图像作为散点图数据点

ruby - 从 ruby​​ 的独家范围中获得最大值(value)的最快方法

python - numpy数组迭代的优化

java - 我们是否应该以多个声明为代价来本地化作用域变量

java - 在 Groovy 脚本中使用 @Field 变量

java - 中断等待阻塞操作的线程?