2011-01-07 5 views
1

내가 이해하는 바에 따르면, PHP stdClass은 코드가 실제로 중요하게 중첩되어있을 때 일반적으로 배열보다 빠릅니다. 어떻게 그 효율성이 나는 즉시 stdClass 객체를 정의하는 타입 캐스팅하고있어 경우 영향 : 나는,이려고하고있는 코드가 많은 여러 번 실행되는 경우PHP 배열의 효율성이 객체로 캐스트됩니까?

$var = (object)array('one' => 1, 'two' => 2); 

것이다 것이 더 명시 적으로 객체로 $var를 정의 대신 : 다음, 거기에에서 객체로 어느 쪽이든 $var에 접근 할 것이기 때문에

$var = new stdClass(); 
$var->one = 1; 
$var->two = 2; 

차이는 무시할 수 있습니까?

편집 :

stdClass 내가 여기에서 필요로하는 데이터 형식입니다. 나는 배열을 사용해야하는지 또는 stdClass 객체를 사용해야하는지 여부에 관심이 없다. 더 stdClass을 인스턴스화하는 (object)array(....)의 축약어를 사용하는 것이 효율적인지에 더 관심이 있습니다. 그리고 예, 이것은 수천 번 잠재적으로 실행될 코드입니다.

+1

stdClass는 배열을 대신 할 수 없습니다. ArrayObject를 대신 사용해보십시오. 또한 '훨씬 더 빠름'은 상대적이며 대부분의 경우 실제로는 부적합합니다. – Mchl

답변

3
function benchmark($func_name, $iterations) { 
    $begin = microtime(true); 
    for ($i = 0; $i < $iterations; $i++) { 
     $func_name(); 
    } 
    $end = microtime(true); 

    $execution_time = $end - $begin; 

    echo $func_name , ': ' , $execution_time; 
} 

function standClass() { 
    $obj = new stdClass(); 
    $obj->param_one = 1; 
    $obj->param_two = 2; 
} 

function castFromArray() { 
    $obj = (object)array('param_one' => 1, 'param_two' => 2); 
} 


benchmark('standClass', 1000); 
benchmark('castFromArray', 1000); 

benchmark('standClass', 100000); 
benchmark('castFromArray', 100000); 

출력 : (

standClass: 0.0045979022979736 
castFromArray: 0.0053138732910156 

standClass: 0.27266097068787 
castFromArray: 0.20209217071533 

즉석에서 stdClass에 배열에서 주조은 약 30 % 더 효율적입니다,하지만 당신은 당신이 동작을 10 회 수행 될 것입니다 알고있을 때까지의 차이는 여전히 무시할 심지어 그때조차도, 적어도 내 컴퓨터에서는 10 분의 1 초만 보입니다.)

간단히 말해서, 대다수의 시간에는 아무런 문제가되지 않지만, 그렇다면 단일 명령으로 배열을 정의한 다음이를 객체에 입력 캐스트하십시오. 문제의 코드를 병목 현상으로 파악한 다음 (가능한 경우 반복 횟수를 줄이는 데 초점을 맞춘 경우가 아니면) 걱정하지 않아도됩니다.

7

귀하는 잘못 알고 있습니다. 객체는 배열보다 훨씬 빠릅니다. 배열은 상속 (및 가시성 조회)의 문제가 없으므로 사실 반대가 일반적으로 사실입니다. 확실히 확실한 이득/손실을 보여줄 수있는 특별한 경우가있을 수 있지만 일반적인 경우 배열은 더 빠른 경향이 있습니다 ...

의미 상으로 정확한 도구를 사용하십시오. 객체가 더 빠르다고 생각하기 때문에 배열을 사용하지 마십시오. 그것이 의미가있을 때 구조를 사용하십시오. 배열을 객체로 대체하는 것이 의미있는 경우가 있습니다 (예 : 배열의 유형을 엄격하게 적용하려는 경우). 그러나 이것은 그들 중 하나가 아닙니다. 심지어 array()를 STDClass로 대체하지 않을 경우 사용자 정의 클래스 (ArrayObject을 확장하거나 적어도 IteratorArrayAccess 인터페이스를 구현하는 클래스)로 대체 할 수 있습니다. 다른 이유로 Data Structures이 존재합니다. 배열 대신 객체를 사용하는 것이 더 좋았다면 우리 모두가 대신 객체를 사용하지 않겠습니까?

"빠른 캐스트"와 같은 미세 최적화는 염려하지 마십시오. almost always not입니다. 읽기 쉽고 정확한 코드를 작성하십시오. 그런 다음 문제가있는 경우 최적화하십시오 ...

0

올바른 작업에 적합한 데이터 구조를 선택하는 것이 더 중요합니다.

사용할 항목을 결정할 때 자신에게 물어보십시오. 데이터가 나타내는 것은 무엇입니까?

집합이나 시퀀스를 대표하고 있습니까? 그런 다음 아마 배열을 사용해야합니다.

당신은 특정 속성이나 행동으로 어떤 것을 표현하고 있습니까? 그런 다음 아마도 객체를 사용해야합니다.