【问题标题】:Java getChars method in Integer class, why is it using bitwise operations instead of arithmetic?Integer类中的Java getChars方法,为什么它使用按位运算而不是算术?
【发布时间】:2020-05-28 12:28:38
【问题描述】:

所以我正在检查Integer 的类source code (JDK 8) 以了解int 如何转换为String。它似乎正在使用一个名为 getChars 的包私有方法(第 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 optimization


【解决方案1】:

我不知道具体更改的原因,除非您找到原作者,否则无论如何您都不太可能找到权威的答案。

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

这基本上有两个原因:

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

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

【讨论】:

    【解决方案2】:

    这样做有几个原因。作为一名资深的嵌入式开发人员,使用有时甚至没有乘法和除法指令的微型微控制器,我可以告诉你这要快得多。这里的关键是乘数是一个常数。如果您将两个变量相乘,则需要使用较慢的乘法和除法运算符,或者,如果它们不存在,则使用带有加法运算符的循环执行乘法。

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2016-08-17
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 1970-01-01
      • 2014-08-06
      • 1970-01-01
      相关资源
      最近更新 更多