그냥 지역변수, 클래스 멤버변수에 배열을 대입하는 시간이 다르다.
추가 : 대입만이 아니라 꺼내오는 시간도 달라진다.
아래와 같은 소스코드를 이용하여 각 1천만개짜리 배열에 값을 계산해 넣는 시간과 메모리 사용량을 체크해봤다.
<?PHP
define('LOOP_COUNT', 10000000);
class Test
{
private $data = array();
public function exe()
{
for ($i=0; $i<LOOP_COUNT; $i++) $this->data[$i] = $i * 2 / 11 % 13;
}
public function exe_local()
{
$data = array();
for ($i=0; $i<LOOP_COUNT; $i++) $data[$i] = $i * 2 / 11 % 13;
$this->data = $data;
}
}
// 지역변수 대입
if (!$argv[1]) {
$data = array();
for ($i=0; $i<LOOP_COUNT; $i++) $data[$i] = $i * 2 / 11 % 13;
}
// 클래스 멤버변수에 대입
else if ($argv[1] == 'class') {
$Test = new Test;
$Test->exe();
}
// 클래스 메소드 내부 지역변수에 대입한 다음 마지막에 클래스 멤버변수에 대입
else if ($argv[1] == 'class_local') {
$Test = new Test;
$Test->exe_local();
}
printf("MEMORY PEAK USAGE = %.2f MB\n", memory_get_peak_usage() / 1024 / 1024);
지역변수
실행시간 = 3.471 초
메모리 = 1425.62 MB
클래스 멤버변수
실행시간 = 4.463 초
메모리 = 1425.63 MB
클래스 메소드 내부 지역변수 이용
실행시간 = 3.433 초
메모리 = 1425.63 MB
결론
메모리 사용량은 동일하나 실행시간에서 차이가 났다.
코드 완성도와 실행 퍼포먼스 두마리의 토끼를 잡을 수 있는 건,
클래스를 사용하되 멤버변수에 바로 대입하지 않고 계산이 끝난 결과만 대입하는 것.
대용량을 다룰 경우(-_-) 격차는 더 심해진다.
배열 해시테이블 할당하는 과정이 달라서 그런지 이유는 명확히 알 수 없으나,
막 짜놓은 스크립트를 클래스로 뜯어내는 과정에서 실행시간이 너무(!) 차이가 나서 테스트 후 원인을 발견하여 기록을 남겨둠.
'PHP' 카테고리의 다른 글
[PHP] 날짜 일수 차이 계산 [date_diff(), DateTime, DateInterval] (0) | 2012.10.11 |
---|---|
[PHP] 시그널 핸들러 사용하기 (signal handler, SIGTERM) (0) | 2012.09.11 |
[PHP] Jaccard's coefficient를 위한 intersect, union 구하는 방법. (0) | 2012.08.29 |
[PHP] gzdecode() 함수가 없다고 에러 나올 때 (1) | 2012.08.28 |
[PHP] 이미지 바이너리 데이터 가져와서 <img> 태그를 이용해 출력하기. (0) | 2012.08.26 |