2014-04-29 2 views
4

PHP에서 타입 힌팅의 성능 오버 헤드는 얼마나 중요한가? 사용 결정 여부에 대해 고려해야 할 중요성이 있습니까?PHP에서 타입 힌트의 성능 오버 헤드는 무엇입니까?

+2

아니요. 진지하게. 타입 힌트를 사용하지 않았기 때문에 런타임에 유형 힌팅이 발생하지 않으므로 잡히지 않은 버그를 수정하는 데 더 많은 시간을 할애 할 수 있습니다. 당신이 정말로 알고 싶다면 벤치 마크하십시오. – deceze

+2

유형 힌트는 코드를 체계화하기위한 것입니다. 주저하지 말고 사용하십시오. 벤치마킹 시간을 낭비하지 마십시오. – Ibu

+1

평균적인 차이는 없습니다 : http://3v4l.org/lWgY6/perf#tabs, http://3v4l.org/110SL/perf#tabs – deceze

답변

5

아니요, 중요하지 않습니다. 사운드 프로세싱이나 3D 프로그래밍과 같이 알고리즘 집약적 인 작업을 수행해야한다면 다른 프로그래밍 언어를 사용해야합니다. 내 컴퓨터는 하드 데이터를 원하는 경우, 벤치 마크를 만들

...

<?php 

function with_typehint(array $bla) 
{ 
    if(count($bla) > 55) { 
     die("Array to big"); 
    } 
} 

function dont_typehint($bla) 
{ 
    if(count($bla) > 55) { 
     die("Array to big"); 
    } 
} 

function benchmark($fn) 
{ 
    $start = microtime(TRUE); 
    $array = array("bla", 3); 
    for($i=0; $i<1000000; $i++) { 
     $fn($array); 
    } 
    $end = microtime(TRUE); 
    return $end-$start; 
} 

printf("with typehint: %.3fs\n", benchmark("with_typehint")); 
printf("dont typehint: %.3fs\n", benchmark("dont_typehint")); 

는 성능은 동일합니다. 때로는 빨리와, 때로는 typehinting없는 : 당신은 예를 들어, 간단한 bechmark을 만들어 답을 찾을 수 있습니다

$ php Documents/type_hinting.php 
with typehint: 0.432s 
dont typehint: 0.428s 

$ php Documents/type_hinting.php 
with typehint: 0.414s 
dont typehint: 0.416s 
+1

별도의 파일 (아마도 네임 스페이스/자동로드)의 클래스 계층 구조와 관련된보다 현실적인 시나리오는 무엇입니까? – Alastair

+0

내 예제는 형식 힌팅의 영향을 과대 평가한다는 점에서 비현실적입니다. 예제에서는 1) 타입 힌팅, 2) 함수 호출 (with_typehint), 3) 다른 함수 호출 (count), 4) 비교, 5) "암시 적"return 문이 있습니다. 내 코드의 20 %는 타입 힌팅의 영향을받습니다. 현실적인 예에서 시간 낭비되는 시간의 1 % 미만이 유형 힌팅이 발생하는 장소에있을 것이므로 차이를 훨씬 더 줄일 수 있습니다. tl; dr : 예를 들어 시간차를 측정 할 수없는 경우 현실적인 예에서도 시차를 측정하지 않습니다. – Michael

+0

@Alastair 확실하지 않으면 다른 테스트를 작성하십시오. 하지만 IMHO 이것은 낭비되는 시간입니다. – Michael

1

:

내 컴퓨터에서 1 개 000 000 루프에 대한

$test1 = function(stdClass $obj){}; 
$test2 = function($obj){}; 

$begin = microtime(true); 
for ($i = 0; $i < 1000000; $i++){ 
    $test1(new stdClass); 
} 
$end = microtime(true); 

$timeElapsedTest1 = $end - $begin; 

$begin = microtime(true); 
for ($i = 0; $i < 1000000; $i++){ 
    $test2(new stdClass); 
} 
$end = microtime(true); 

$timeElapsedTest2 = $end - $begin; 

echo 'difference: ', $timeElapsedTest1 - $timeElapsedTest2; 

차이

1. 0.0994789600372 ms 
2. 0.0944871902466 ms 
3. 0.103265047073 ms 
4. 0.0899112224579 ms 
5. 0.0860922336578 ms 
6. 0.0973558425903 ms 
7. 0.0905900001526 ms 
8. 0.0891189575195 ms 
9. 0.09983086586 ms 
10. 0.0914621353149 ms 

stdClassarray으로 바꾼 후 내 컴퓨터의 1 000 000 루프의 차이가 약간 변경되었습니다.

1. 0.00209307670593 ms 
2. 0.00217390060425 ms 
3. 0.00558805465698 ms 
4. 0.00264406204224 ms 
5. 0.00367116928101 ms 
6. 0.00262594223022 ms 
7. 0.00353169441223 ms 
8. 0.00217604637146 ms 
9. 0.00049090385437 ms 
10. 0.002516746521 ms 
관련 문제