在查看我昨天问的一个微优化问题时(here https://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root-is-an-integer),我发现了一些奇怪的事情:or
Java中的语句正在运行slightly比在布尔数组中查找布尔值更快。
在我的测试中,运行以下算法long
值从 0 到 10 亿,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 语句可以作为四个指令来实现。第二个可能需要空指针检查、边界检查以及加载和比较。此外,更多的代码意味着更多的编译时间,并且更有可能以某种方式阻碍优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)