PHP를 사용하면서 배열(Array)를 사용하지 않는 경우란 매우 드물겁니다. 배열(Array)와 사전(Dictionary)로 구별하는 Perl이나 Python과 달리 둘이 합쳐진 모양새를 가진 PHP 배열(이하 Array)은 PHP로 프로그래밍을 할 때 감초처럼 빠지지 않는 자료 구조일겁니다.
하지만, Array가 언제나 최적의 도구는 아닙니다. 경우에 따라 다른 도구를 사용하는 것이 좀 더 나은 결과를 만들어 낼 수도 있습니다. 이 글에서는 Array와 비슷하지만 조금은 다른 또 다른 배열 형태의 자료 구조 두가지를 소개하려고 합니다.
SplFixedArray
SPL(Stardard PHP Library)에는 다양한 자료 구조를 처리하는 클래스가 포함되어 있습니다. 그 중 하나가 SplFixedArray입
니다. 이름에서 알 수 있듯 크기를 정하지 않고 사용하는 Array와 달리 인스턴스 생성시 고정된 크기를 정하는 클래스입니다.
인스턴스를 생성해야 한다는 것을 제외하면 기본적인 사용법은 Array와 동일합니다.
|
|
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
를 사용하는 것이 성능면에서 상당한 잇점이 있습니다.
|
|
마무리
보통의 경우 기본 Array로 충분하지만, 데이터의 갯수고 고정적이거나 첨자가 매우 드물게 떨어져있는 경우 SplFixedArray
나 Judy
를 사용해서 더 빠르게 처리 할 수 있습니다. 다만 SplFixedArray
나 Judy
의 경우 배열 관련 기본 내장 함수를 이용하는 것이 불가능하므로 이점을 미리 감안하여야 합니다.
지금까지 PHP 기본 Array만 사용하셨다면 SplFixedArray
나 Judy
를 이용하여 좀 더 성능 좋은 PHP를 경험 해보시길 권합니다.