在查看我昨天提出的一个微优化问题 (here) 时,我发现了一些奇怪的事情:Java 中的 or
语句的运行速度稍微比在 boolean 数组中查找 boolean 值。
在我的测试中,对从 0 到 10 亿的 long
值运行以下算法,alg1 大约快 2%。 (我改变了算法测试的顺序,我得到了相同的结果)。我的问题是:为什么 alg1 更快?我原以为 alg2 会稍微快一些,因为它使用查找表,而 alg1 必须对 75% 的输入执行 4 次比较和 3 次或操作。
private final static boolean alg1(long n)
{
int h = (int)(n & 0xF);
if(h == 0 || h == 1 || h == 4 || h == 9)
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
return false;
}
private final static boolean[] lookup = new boolean[16];
static
{
lookup[0] = lookup[1] = lookup[4] = lookup[9] = true;
}
private final static boolean alg2(long n)
{
if(lookup[(int)(n & 0xF)])
{
long tst = (long)Math.sqrt(n);
return tst*tst == n;
}
else
return false;
}
如果您好奇的话,这段代码正在测试一个数字是否是一个完全平方数,并且利用了完全平方数必须以十六进制形式的 0、1、4 或 9 结尾的事实。
最佳答案
加载一些随机数据通常比一些非分支代码慢。
当然,这完全取决于处理器架构。您的第一个 if 语句可以用四个指令来实现。第二个可能需要空指针检查、边界检查以及加载和比较。此外,更多的代码意味着更多的编译时间,以及更多以某种方式阻碍优化的机会。
关于java - 为什么这段包含多个 "or"语句的代码比在 Java 中使用查找表稍微快一些?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/299079/