Good Day

[PHP7] foreach와 while(list()=each()) 간단 성능비교 본문

개발/PHP

[PHP7] foreach와 while(list()=each()) 간단 성능비교

영악 2016. 10. 27. 12:01

※ 주의1: 별다른 생각 없이 개발하면서 적는 부분이므로 절대 네버 에버 절대치는 아닙니다.

※ 주의2: 올바른 테스트 방법이 아닐 수 있으므로 의견 제시해주시면 참고하겠습니다.




Fanmaum팀에서 작업하다가 엑심베이에서 뭘 덜해줬는지 Alipay가 짤리는 바람에 

Alipay를 오리지널로 붙히는 작업을 하게 되었다.



작업 도중에 예전에는 쓰다가 안쓰게된, 반복문 관련해서 차이가 있나 싶은 코드를 발견해서 간단하게 테스트 했다.


  • 환경: AWS t2.micro / nginx 1.4 / php7.0.12
  • 조건: 작성중인 php 클래스 내에 함수 두개 생성 후 각각 10만번(100,000) 호출을 20회 진행
  • 테스트 코드 1 - AlipayUtil Class 내에 함수 두개

class AlipayUtil { /** * 배열을 Query string(&key=value)으로 변환한다. * @param $para 합칠 매개변수 배열 * return 완성된 query string 문자열 */ public function createLinkstring($para) { $arg = ""; while (list ($key, $val) = each ($para)) { $arg.=$key."=".$val."&"; } //마지막 &을 제거 //$arg = substr($arg,0,count($arg)-2); //자동 이스케이프가 켜져있으면 slash를 정리해준다. //if(get_magic_quotes_gpc()){$arg = stripslashes($arg);} return $arg; } /** * 배열을 Query string(&key=value)으로 변환한다. * @param $para 합칠 매개변수 배열 * return 완성된 query string 문자열 */ public function createLinkstringForeach($para) { $arg = ""; foreach( $para as $key => $val ){ $arg.=$key."=".$val."&"; } //마지막 &을 제거 //$arg = substr($arg,0,count($arg)-2); //자동 이스케이프가 켜져있으면 slash를 정리해준다. //if(get_magic_quotes_gpc()){$arg = stripslashes($arg);} return $arg; } (이하 생략)

  • 테스트 코드 2 - 테스트 실행코드

$util = new AlipayUtil(); $params = [ 'partner' => '2088101122136241', 'key' => '760bdzec6y9goq7ctyx96ezkz78287de', 'notify_url' => 'aaaaaa', 'return_url' => 'as65d41q98w4d89', 'cacert' => getcwd().'/cacert.pem', ]; $start_time = microtime(true); for ($i=0; $i < 100000; $i++) { $e = $util->createLinkstring($params); unset($e); } $end_time = microtime(true); echo 'original_runtime: '.($end_time-$start_time).'<br/>'; $start_time = microtime(true); for ($i=0; $i < 100000; $i++) { $e = $util->createLinkstringForeach($params); unset($e); } $end_time = microtime(true); echo 'foreach_runtime: '.($end_time-$start_time).'<br/>';


1회차

original_runtime: 0.18685507774353

foreach_runtime: 0.064045906066895


2회차

original_runtime: 0.21014499664307

foreach_runtime: 0.064871072769165


3회차

original_runtime: 0.18757891654968

foreach_runtime: 0.064393997192383


4회차

original_runtime: 0.18810296058655

foreach_runtime: 0.064836978912354


5회차

original_runtime: 0.18863606452942

foreach_runtime: 0.064652919769287


6회차

original_runtime: 0.18769288063049

foreach_runtime: 0.064851999282837


7회차

original_runtime: 0.1881890296936

foreach_runtime: 0.063837766647339


8회차

original_runtime: 0.18890118598938

foreach_runtime: 0.064695119857788


9회차

original_runtime: 0.18895411491394

foreach_runtime: 0.065633058547974


10회차

original_runtime: 0.19127202033997

foreach_runtime: 0.06474494934082



테스트 결과 foreach 승리


Comments