Kip*_*Kip 10 java optimization
虽然看着微的优化问题,我问昨天(这里),我发现了一些奇怪的事情:一个or用Java语句运行稍微比boolean数组中查找一个布尔值更快.
在我的测试中,运行以下算法的long值从0到10亿,alg1大约快2%.(我已经改变了算法测试的顺序,我得到了相同的结果).我的问题是:为什么alg1更快? 我原本期望alg2稍快一些,因为它使用查找表,而alg1必须执行4次比较,3次或75%的输入操作.
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;
}
Run Code Online (Sandbox Code Playgroud)
如果你很好奇,这段代码会测试一个数字是否是一个完美的正方形,并利用完美正方形必须以十六进制表示0,1,4或9结尾的事实.
加载一些随机数据通常比一些非分支代码慢.
当然,这完全取决于处理器架构.您的第一个if语句可以实现为四条指令.第二个可能需要空指针检查,边界检查以及加载和比较.此外,更多代码意味着更多的编译时间,并且以某种方式阻止优化的机会更多.
| 归档时间: |
|
| 查看次数: |
1040 次 |
| 最近记录: |