PHP를 사용하면서 배열(Array)를 사용하지 않는 경우란 매우 드물겁니다. 배열(Array)와 사전(Dictionary)로 구별하는 Perl이나 Python과 달리 둘이 합쳐진 모양새를 가진 PHP 배열(이하 Array)은 PHP로 프로그래밍을 할 때 감초처럼 빠지지 않는 자료 구조일겁니다.

하지만, Array가 언제나 최적의 도구는 아닙니다. 경우에 따라 다른 도구를 사용하는 것이 좀 더 나은 결과를 만들어 낼 수도 있습니다. 이 글에서는 Array와 비슷하지만 조금은 다른 또 다른 배열 형태의 자료 구조 두가지를 소개하려고 합니다.

SplFixedArray

SPL(Stardard PHP Library)에는 다양한 자료 구조를 처리하는 클래스가 포함되어 있습니다. 그 중 하나가 SplFixedArray입니다. 이름에서 알 수 있듯 크기를 정하지 않고 사용하는 Array와 달리 인스턴스 생성시 고정된 크기를 정하는 클래스입니다.

인스턴스를 생성해야 한다는 것을 제외하면 기본적인 사용법은 Array와 동일합니다.

1
2
3
4
5
<?php
$sfa = new SplFixedArray(100);
for ($i = 0; $i < 100; $i++) {
    $sfa[$i] = $i;
}

SplFixedArray과 Array의 가장 큰 차이점은 생성시 지정한 크기를 벗어나는 경우 RuntimeException을 던진다는 것입니다. 만약 배열의 크기가 고정적이거나, 가변적으로 바뀌는 상황이 아니라면 SplFixedArray를 사용하는 것이 속도면에서 잇점이 있습니다. PHP 5.6 기준으로 읽기는 다소 빠른 수준이나 쓰기는 약 1.5 ~ 2배의 속도 차이가 있습니다.

만약 SplFixedArray의 크기를 바꿔야 할 필요가 생긴다면 SplFixedArray::setSize 함수를 통해서 크기를 변경 할 수 있습니다. 다만, 현재 크기 보다 작은 크기로 바꾸는 경우 뒤 쪽 데이터가 잘려나가면, 큰 경우는 null이 뒤에 따라붙게 됩니다.

Judy Array

PHP의 또 다른 배열 한가지는 Judy입니다. SPL와 같은 기본 모듈은 아니지만 PECL을 통해 손쉽게 로드 할 수 있습니다. 한가지 아쉬운 점은 현재 1.0.2 버전 기준으로 PHP 5.6까지만 지원한다는 점입니다.

Judy는 Sparse Array에 특화된 배열입니다. 즉, 첨자가 연속적이지 않고 매우 드물게 나타나는 배열을 처리하는데 강점을 가집니다. Array와 비교하면 약 4 ~ 12배 정도의 성능 차이를 보입니다. 만약 다루려는 데이터가 Sparse Array 형태라면 Judy를 사용하는 것이 성능면에서 상당한 잇점이 있습니다.

1
2
3
4
5
<?php
$judy = new Judy(Judy::INT_TO_INT);
for ($i = 0; $i < 100; $i++) {
    $judy[$i * 1000000] = $i;
}

마무리

보통의 경우 기본 Array로 충분하지만, 데이터의 갯수고 고정적이거나 첨자가 매우 드물게 떨어져있는 경우 SplFixedArrayJudy를 사용해서 더 빠르게 처리 할 수 있습니다. 다만 SplFixedArrayJudy의 경우 배열 관련 기본 내장 함수를 이용하는 것이 불가능하므로 이점을 미리 감안하여야 합니다.

지금까지 PHP 기본 Array만 사용하셨다면 SplFixedArrayJudy를 이용하여 좀 더 성능 좋은 PHP를 경험 해보시길 권합니다.