gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:13:47 25 4
gpt4 key购买 nike

所以我正在检查 Integer 的类 source code (JDK 8) 了解如何将 int 转换为 String。它似乎正在使用一个名为 getChars(第 433 行)的包私有(private)方法将 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 次时,优化服务器中的方法以减少 0.1% 的 CPU 时间,这将不值得您为此付出努力。但是,如果您可以使Integer.toString 对将要执行它的每个人 的速度提高 0.1%,那么这确实会变成一个非常大的变化。
  2. 如果您在特定 VM 上优化您的应用程序代码,那么当编译器决定以不同方式进行优化时,将该 VM 更新到较新版本可以轻松取消您的优化。对于 java.* 中的代码,这远不是一个问题,因为它总是与运行它的运行时一起提供。因此,如果他们引入了编译器更改,使给定的优化不再是最优的,那么他们可以更改代码以匹配这一点。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com