TIP게시판

제목 연관배열 vs 객체
글쓴이 지훈임돠 작성시각 2012/12/14 09:26:39
댓글 : 13 추천 : 0 스크랩 : 0 조회수 : 13014   RSS
CI 에서 엑티브레코드 기본함수 리턴값이 객체라서,

여지껏 객체위주로 써오다가...

배열 vs 객체 쳐보니...

배열이 더 빠르다고,

왠만하면 배열 쓰라고 합니다~



 다음글 오페라 모바일 브라우져 (2)
 이전글 테이블 칼럼이름값 자동으로 가져오기

댓글

milosz / 2012/12/14 09:45:10 / 추천 0
 http://aggregation.novaak.net/?q=node/227
 
버전에 따라 다른가보네요... 테스트코드 만들어서 한번 다같이 돌려보는거 어떨까요?ㅎㅎ
지훈임돠 / 2012/12/14 09:54:03 / 추천 0
<?
function p($i) {
  echo '<pre>';
  print_r($i);
  echo '</pre>';
}




$t0 = microtime(true);
for ($i=0; $i<1000; $i++) {
    $z = (object) null;
    for ($j=0; $j<1000; $j++) {
        $z->aaa = 'aaa';
        $z->bbb = 'bbb';
        $z->ccc = $z->aaa.$z->bbb;
    }
}
echo '<p>obj: '.(microtime(true) - $t0);
p($z);

$t0 = microtime(true);
for ($i=0; $i<1000; $i++) {
    $z = array();
    for ($j=0; $j<1000; $j++) {
        $z['aaa'] = 'aaa';
        $z['bbb'] = 'bbb';
        $z['ccc'] = $z['aaa'].$z['bbb'];
    }
}
echo '<p>arrays: '.(microtime(true) - $t0);
p($z);

echo '<p> phpversion '.phpversion();

지훈임돠 / 2012/12/14 09:56:03 / 추천 0
 위 코드로 테스트한 결과입니다.
 
obj: 1.0816578865051
arrays: 0.65077614784241
phpversion 5.3.18
milosz / 2012/12/14 10:03:21 / 추천 0
obj가 빠르다는 글들은 어떤 상황인걸까요? 흠..
 
obj: 1.1751770973206
arrays: 0.74294209480286
phpversion 5.3.13

 

지훈임돠 / 2012/12/14 10:04:35 / 추천 0
 오브젝트가 코딩하기는 더 편한거같아요..ㅎㅎ
a['하하']
a->하하
타자 4개 쳐야할거를 2개만 치면 되니...
milosz / 2012/12/14 10:08:42 / 추천 0
처리속도는 array가 빠른데 작업속도는 object가 빠르다던가ㅎㅎ
인터프리터다보니 차이가 많이 나나보네요.
한대승(불의회상) / 2012/12/14 11:06:01 / 추천 0
재미 있어 보여 저도 테스트.. ^^
일단 CI를 사용하니 CI의 벤치마크 기능과 프로파일러를 써서 테스트 해 봤습니다.

OS : MAC OS X 10.7.5

PHP버젼 : 5.3.1

* 소스 코드
<?php
class test_obj {
 public $aaa;
 public $bbb;
 public $ccc;
 
 function __construct()
 {
  $this->aaa = 'aaa';
  $this->bbb = 'bbb';
  $this->ccc = NULL;
 }
 
 function set_ccc($aaa, $bbb)
 {
  $this->ccc = $aaa . $bbb;
 }
}

class Arr_vs_obj extends CI_Controller {
 function index()
 {
  $this->output->enable_profiler(TRUE);
  
  $arr = array();
  $obj = NULL;
  
  $this->benchmark->mark('array_set_start');
   for($i=0; $i < 1000; $i++) {
    $arr[] = array(
     'aaa' => 'aaa',
     'bbb' => 'bbb',
     'ccc' => NULL
    );
   }
  $this->benchmark->mark('array_set_end');
  $this->benchmark->mark('array_foreach_start');
   foreach($arr as $item) $item['ccc'] = $item['aaa'] . $item['bbb'];
  $this->benchmark->mark('array_foreach_end');
  $this->benchmark->mark('obj_set_start');
   for($i=0; $i < 1000; $i++) {
    $obj[] = new test_obj;
   }
  $this->benchmark->mark('obj_set_end');
  $this->benchmark->mark('obj_foreach1_start');
   foreach($obj as $item) $item->ccc = $item->aaa . $item->bbb;
  $this->benchmark->mark('obj_foreach1_end');
  $this->benchmark->mark('obj_foreach2_start');
   foreach($obj as $item) $item->set_ccc($item->aaa, $item->bbb);
  $this->benchmark->mark('obj_foreach2_end');
 }
}
* 결과
  BENCHMARKS  
Loading Time: Base Classes  0.0075
Array Set  0.0018
Array Foreach  0.0015
Obj Set  0.0031
Obj Foreach1  0.0009
Obj Foreach2  0.0016
Controller Execution Time ( Arr Vs Obj / Index )  0.0123
Total Execution Time  0.0199
Object 변수에 직접 접근 할 때는 배열 보다 빠르군요. ^^

milosz / 2012/12/14 11:09:09 / 추천 0
이미 객체 위에서 동작하는 경우는 객체가 더 빠른가보네요.
갈수록 흥미로운 결과가... 과연 최후의 승자는?!ㅎ
지훈임돠 / 2012/12/14 11:45:02 / 추천 0
 
class Arr_vs_obj extends CI_Controller {
 function index()
 {
  $this->output->enable_profiler(TRUE);

  $arr = array();
  $obj = NULL;

  $this->benchmark->mark('array_set_start');
   for($i=0; $i < 1000; $i++) {
    $arr[] = array(
     'aaa' => 'aaa',
     'bbb' => 'bbb',
     'ccc' => NULL
    );
   }
  $this->benchmark->mark('array_set_end');
  $this->benchmark->mark('array_foreach_start');
   foreach($arr as $item) $item['ccc'] = $item['aaa'] . $item['bbb'];
  $this->benchmark->mark('array_foreach_end');
  $this->benchmark->mark('array_foreach0_start');
   foreach($arr as $item) $ttt++;;
  $this->benchmark->mark('array_foreach0_end');
  $this->benchmark->mark('obj_set_start');
   for($i=0; $i < 1000; $i++) {
    $obj[] = new test_obj;
   }
  $this->benchmark->mark('obj_set_end');
  $this->benchmark->mark('obj_foreach1_start');
   foreach($obj as $item) $item->ccc = $item->aaa . $item->bbb;
  $this->benchmark->mark('obj_foreach1_end');
  $this->benchmark->mark('obj_foreach2_start');
   foreach($obj as $item) $item->set_ccc($item->aaa, $item->bbb);
  $this->benchmark->mark('obj_foreach2_end');
  $this->benchmark->mark('obj_foreach0_start');
   foreach($obj as $item) $kkk++;
  $this->benchmark->mark('obj_foreach0_end');
 }
}

class test_obj {
 public $aaa;
 public $bbb;
 public $ccc;

 function __construct()
 {
  $this->aaa = 'aaa';
  $this->bbb = 'bbb';
  $this->ccc = NULL;
 }

 function set_ccc($aaa, $bbb)
 {
  $this->ccc = $aaa . $bbb;
 }
}
지훈임돠 / 2012/12/14 11:45:27 / 추천 0
 
Loading Time: Base Classes  0.0072
Array Set  0.0008
Array Foreach  0.0008
Array Foreach0  0.0004
Obj Set  0.0015
Obj Foreach1  0.0005
Obj Foreach2  0.0009
Obj Foreach0  0.0001
Controller Execution Time ( Arr Vs Obj / Index )  0.0139
Total Execution Time  0.0212
지훈임돠 / 2012/12/14 11:46:57 / 추천 0
Obj Foreach0  은 foreach 속도만 비교한건데요.

set 은 array 가 빠르고...

foreach 는 array 가 느리네요
한대승(불의회상) / 2012/12/14 12:31:45 / 추천 0
결론... 그때그때 달라요.. ^^
헛발이 / 2012/12/14 12:37:45 / 추천 0
PHP는 인공지능 ㅋㅋ