所以我正在检查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.*
和许多内部包)是优化到的程度对于应用于“正常”应用程序代码来说是非常不寻常的(而且我敢说是不负责任的)。
这基本上有两个原因:
- 它在许多不同的环境中被调用很多。如果您的服务器中的方法每天仅在 3 台服务器上执行 50 次(每台服务器各执行 50 次),那么优化服务器中的方法以减少 0.1% 的 CPU 时间是不值得的。但是,如果您可以使
Integer.toString
对于执行它的每个人来说速度提高 0.1%,那么这确实会带来很大的变化。 - 如果您在特定虚拟机上优化应用程序代码,那么当编译器决定以不同方式进行优化时,将该虚拟机更新到较新版本可以轻松撤销您的优化。对于
java.*
中的代码,这不是一个问题,因为它总是与运行它的运行时一起提供。因此,如果他们引入了编译器更改,使给定的优化不再是最佳的,那么他们可以更改代码以匹配这一点。
tl;dr java.*
代码通常会被优化到疯狂的程度,因为它是值得的,而且他们可以知道它实际上会工作。
关于Java Integer类中的getChars方法,为什么它使用按位运算而不是算术运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55791304/