【发布时间】:2018-03-27 16:29:17
【问题描述】:
问题就这么简单: 将两个低值与一个常见的基本运算(如加法、除法、模数、位移位等)组合起来会比相同的值更大的运算更快吗?
据我所知,这需要 CPU 跟踪最重要的位(我认为这不太可能),但业务中可能还有其他问题。
我之所以特别问,是因为我经常看到一些 Java 的基本类的 hashCode() 方法(例如 String 和 List)中使用了相当低的质数(例如 31),这令人惊讶,因为更大的值会很可能会导致更多的传播(这对于散列函数来说通常是一件好事)。
【问题讨论】:
-
AFAIK 处理器不关心某个变量类型中的值,在 Java 的哈希码中使用 31 背后的原因在提议的欺骗中得到了很好的解释。
-
对于除法和取模(实际除法和取模,左操作数不变,它们不算数),实际上是的,也许,这取决于。它们是值很重要的极少数操作中的两个。
-
这不是重复的,因为我只是引用
hashCode()函数。我以前知道这篇文章,并且很清楚那里指出的某些相关情况。但是,我的实际问题,CPU 是否可以更快地处理低值,当然没有在那里回答,这使我自己的问题合法化。 -
也可以:
x * 31非常有效地计算为x << 5 - x。但是,x * 65,537(65,537作为第 4 个fermat number 是素数)的计算速度与x << 16 + x一样快,据我所知,这会导致更好的扩散。 -
65,537等较大数字的问题是需要大于 16 位的可变大小。 Java 可以针对包括 16 位架构的嵌入式处理器。所以目标架构字长也可能是一个考虑因素。
标签: java performance cpu computation