2009-02-03 2 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; 
} 

업데이트를 위해 쓴 : 그래서
을 이상한 땅에, 결과는 내가 기대하지만 사전을 사용하고 있었다하지 무엇인가 계산 된 조회 테이블이 우세하게 가장 빠른 것으로 나타났습니다. 속도에 대한 거래 메모리가 항상 우승자입니까?

  • 여기에 시간이있는 테이블이 있었지만 나는 그걸로 스타일링 문제로 인해 그것을 잘라 버렸습니다.
+0

당신이 비트 시프트 연산자를 사용할 수 계산을 필요로하는 코드에서 비트 연산을 인라인 8로 나누고 곱 하시겠습니까? (<< 3 and >> 3) –

+0

PHP에서 많은 비트 조작을 수행하지는 않았지만 모든 표준 비트 연산자 (AND, XOR, OR + 시프 팅)를 사용하므로 가치가 있습니다. – David

답변

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

+0

나는 그렇게 생각했을 것이다. 그러나 알고 있기 위해 멋지다! 측정 해줘서 고마워. –

+0

테이블이 비트 시프트보다 빠르지 않을지 궁금합니다. 순수한 어셈블리 코드에서 테이블은 빠르지 만 테스트를하기 전까지는 볼 수없는 컴파일러에서 항상 흥미로운 오버 헤드가 있습니다. 그래도 기쁘다. –

7

예! 이것은 바이너리의 완벽한 예입니다 :

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

현실적으로 좋은 컴파일러가이 최적화를 찾아 사용하므로 실제로 더 빠를 필요는 없습니다. 테스트하여 컴파일러/통역사가이 작업을 수행하는지 확인하십시오.

8을 기준으로 한 이진 나누기가 3 비트만큼 오른쪽 시프트와 동일하기 때문에 작동합니다. 최신 프로세서는 한 명령에서 32 비트 시프트까지 처리 할 수있는 배럴 시프터를 가지고 있습니다.

역은 쉽게 :

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

-Adam

+0

PHP가 추상화 된 토지의 높이가 얼마나 높은지에 따라 비트 이동이 발생할 수있는 성능상의 이점이있는 것처럼 보입니다. – David

+0

매우 흥미 롭습니다. 배열 작업은 매우 최적화되어있을 가능성이 있지만 바이너리 연산자에 대해서는 거의 관심을 기울이지 않았습니다. PHP 응용 프로그램에서는 자주 사용되지 않습니다. Zend optimizer에서 변경되면 궁금합니다 ... –

+0

ZO는 실제로 최적화합니까? 나는 그것이 대부분은 난독 화/암호화 된 php opcode를 실행하기위한 확장이라고 주장했다. – David

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 선언 및 영향이 없기 때문에 조금 빨라졌습니다.

+0

이상한 곳에서는 여분의 var를 제거하면 코드가 상위 3 개에 놓입니다. – David

1

끝에 배열 (...)을 반환하면 대부분의 성능이 손실된다고 생각합니다.대신, 내가 제안 :
*이 두 가지 기능, Y에 대한 X 용 하나 하나를 정의
        또는
*

관련 문제