Dav*_*vid 4 php math optimization
作为一个有趣的侧面项目,我自己帮助学习另一个PHP MVC框架,我一直在编写Reversi/Othello作为PHP和Ajax应用程序,大多是简单的东西.我决定不使用多维数组有很多原因,而是有一个线性数组(在这种情况下是64个元素长)和几个从坐标转换为整数的方法.
所以我很好奇,有没有其他可能更快的算法将整数转换为坐标点?
function int2coord($i){
$x = (int)($i/8);
$y = $i - ($x*8);
return array($x, $y);
}
//Not a surprise but this is .003 MS slower on average
function int2coord_2($i){
$b = base_convert($i, 10, 8);
$x = (int) ($b != 0 ? $b/8 : 0); // could also be $b < 8 for condition
$y = $b % 10;
return array($x, $y);
}
Run Code Online (Sandbox Code Playgroud)
为了后人的缘故,我为coord2int写的方法
function coord2int($x, $y){
return ($x*8)+$y;
}
Run Code Online (Sandbox Code Playgroud)
更新:
所以在奇怪的土地上,结果不是我所期待的,但使用预先计算的查找表主要表现为最快,猜测交易记忆速度总是赢家?
哦,是的!这是二进制的完美示例:
function int2coord($i){
$x = $i >> 3;
$y = $i & 0x07;
return array($x, $y);
}
Run Code Online (Sandbox Code Playgroud)
实际情况是,一个好的编译器会找到这个优化并使用它,所以它不一定更快.测试并查看您的编译器/解释器是否执行此操作.
它的工作原理是因为任何二进制除以8与右移三位相同.现代处理器具有桶形移位器,可在一条指令中进行高达32位的移位.
反过来也很简单:
function coord2int($x, $y){
return ($x << 3)+$y;
}
Run Code Online (Sandbox Code Playgroud)
-亚当