2009-02-03 77 views
4

作为一个有趣的项目帮助我学习另一个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); 
} 

和对子孙后代着想,方法我写了coord2int

function coord2int($x, $y){ 
    return ($x*8)+$y; 
} 

更新:在奇怪的土地
因此,结果不是我所期待的,但使用预计算查找表主要表现为最快,猜测交易内存的速度永远是赢家?

  • 在这里有一个表与时间,但我削减它由于与SO的样式问题。
+0

你可以使用的比特,移位运算符除以8乘以? (<< 3 and >> 3) – 2009-02-03 14:38:10

+0

我没有在PHP中做过多的位操作,但它确实有所有的标准位操作符(AND,XOR,OR +移位),所以值得一试。 – David 2009-02-03 14:43:48

回答

4

我现在没有时间来测量这个问题,但我会怀疑预先计算的查找表会在速度上超过您的解决方案。该守则将是这个样子:

class Converter { 
    private $_table; 

    function __construct() 
    { 
     $this->_table = array(); 
     for ($i=0; $i<64; $i++) { 
      $this->_table[$i] = array((int)($i/8), (int)($i%8)); 
     } 
    } 

    function int2coord($i) 
    { 
     return $this->_table[$i]; 
    } 
} 

$conv = new Converter(); 
$coord = $conv->int2coord(42); 

当然,这确实增加了不少过头,这样在实践中你只会打扰预先计算所有坐标,如果你转换的​​代码被称为非常常。

+0

预先计算的查找表迄今为止是另外两个时间的一半中最快的。 – David 2009-02-03 15:28:02

+0

我会这么想,但很高兴知道!感谢测量。 – 2009-02-03 15:51:44

7

哦,是的!这是二进制的一个很好的例子:

function int2coord($i){ 
    $x = $i >> 3; 
    $y = $i & 0x07;  
    return array($x, $y); 
} 

现实情况是,一个好的编译器会发现这个优化,并使用它,所以它不是一定会更快。测试并看看你的编译器/解释器是否这样做。

它的工作原理是任何二进制除以8与右移三位相同。现代处理器具有桶式移位器,可以在一条指令中实现高达32位的移位。

反向一样简单:

function coord2int($x, $y){ 
    return ($x << 3)+$y; 
} 

- 亚当

1

我现在不在测量的位置,但你应该能够勉强维持一些额外的速度与此:

function int2coord($i){ 
    $y = $i%8; 
    $x = (int)($i/8); 
    return array($x, $y); 
} 

编辑:不理我 - 亚当的错误答案应该是优越的。

1
function int2coord_3($i){ 
    return array((int) ($i/8), ($i % 8)); 
} 

这是一个快一点,因为没有VAR声明和做作。

1

我认为你的大部分性能在最后返回数组(...)会丢失。相反,我建议:
*定义两个功能,一个用于x和一个y的
       或
*内嵌代码中的位运算需要的计算

相关问题