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

整数类中的Java getChars方法,为什么它使用位运算而不是算术?,java,optimization,Java,Optimization,因此,我检查了整数的类(jdk8),以了解int如何转换为字符串。它似乎在使用名为getChars(第433行)的包私有方法将int转换为char数组 虽然代码并不难理解,但是,有多行代码使用按位移位操作,而不是简单的算术乘法/除法,例如以下代码行: // really: r = i - (q * 100); r = i - ((q << 6) + (q << 5) + (q << 2)); //真的:r=i-(q*100); r=i-((q(16+3));

因此,我检查了
整数的类(
jdk8
),以了解
int
如何转换为
字符串。它似乎在使用名为
getChars
(第433行)的包私有方法将
int
转换为
char
数组

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

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

r=i-((q我不知道这一具体变化的原因,除非你找到原作者,否则你不可能找到权威的答案

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

这基本上有两个原因:

  • 在许多不同的环境中,它被称为很多。优化服务器中的一个方法以减少0.1%的CPU时间,而在3台服务器上每天只执行50次,这是不值得的。但是,如果你可以使
    Integer.toString对所有执行它的人来说都快0.1%,那么这就可以实现了这确实是一个很大的变化
  • 如果您在特定VM上优化应用程序代码,那么当编译器决定以不同方式进行优化时,将该VM更新到新版本可以轻松撤消您的优化。使用
    java.*
    中的代码,这一问题要小得多,因为它始终随运行时一起提供。因此,如果他们引入编译器,则如果ge认为某个给定的优化不再是最优的,那么他们可以更改代码以匹配该优化

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

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

    这回答了你的问题吗?就我所知了解了这一点,为什么还要费心手动操作呢?答案的一部分可能是。你也不能确保自己总是在优化的环境中工作。@razz好吧,你必须询问代码的作者才能知道……互联网上随机的人猜测某人为什么以特定的方式做某事是没有用的,是吗?@Swee根据我的理解,因为它在Java的官方源代码中,所以肯定有一个很好的理由,但我可能错了。
    q = (i * 52429) >>> (16+3);
    r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...