PHP in_array() 내장함수 퍼포먼스 이슈

by HeuJung


개발 | Posted on Sat, Aug 26, 2023 12:55 AM
1

PHP 배열에서 특정값이 있는지 확인을 위해 아래와 같이 in_array() 내장함수를 많이 이용합니다. 

<?php
$arr = [1, 3, 55, 88];
if (in_array(55, $arr)) { ... }

위 방식은 사용이 간편하지만 회사에서 대량의 데이터를 생성하는 배치를 개발하던 도중에 심각한 퍼포먼스 저하 현상을 겪었습니다.

특정 기간 내의 데이터를 조회하여 일/월별로 중복제거 또는 합산을 처리하는 코드를 작성 중이었는데, 중복제거를 위한 배열에 값을 넣어두고 루프를 돌 때마다 값이 있는지 확인하는 로직이었는데요,

in_array() 대신 아래와 같은 방식을 활용하여 퍼포먼스 개선을 할 수 있었습니다.

<?php
$arr = [
    1 => true,
    3 => true,
    55 => true,
    88 => true
];

if(isset($arr[55])) { ... }

위 현상에 대한 ChatGPT 답변은 아래와 같습니다.

두 코드 조각은 모두 주어진 배열에서 특정 요소가 존재하는지 확인하는 방법을 보여주고 있지만, 두 번째 코드 조각이 성능 면에서 더 효율적인 이유는 다음과 같습니다.

첫 번째 코드 조각에서 in_array 함수를 사용하면 배열을 순회하면서 특정 요소를 찾아야 합니다. 배열의 크기에 따라서 성능이 저하될 수 있습니다. 이 함수의 시간 복잡도는 O(n)입니다. 따라서 배열의 크기가 크면 성능 저하가 발생할 수 있습니다.

두 번째 코드 조각에서는 연관 배열(associative array)을 사용하여 각 요소를 키로 가지고 있는데, 이렇게 하면 배열 내에서 특정 요소를 바로 접근할 수 있습니다. 연관 배열에서 요소를 접근하는 시간 복잡도는 O(1)이므로 매우 빠릅니다. 따라서 특정 키의 값에 접근하는 작업은 상수 시간만큼 걸리며, 배열의 크기와 무관합니다.

따라서 두 번째 코드 조각은 특정 키의 값에 접근하는 과정에서 상대적으로 더 빠르며, 큰 배열에서도 성능을 유지할 가능성이 높습니다. 하지만 이러한 성능 차이는 배열의 크기와 사용하는 컴퓨터 환경에 따라 달라질 수 있으므로, 실제 사용 시에는 성능 테스트를 통해 확인하는 것이 좋습니다.

PHP 알고리즘


Leave a Comment:
Emily 2 days ago Edit Delete Reply
<p>고 손을 뻗었고 그의 옷깃을 잡았다 왜 저기 뭐 무서워요 무서워 아까 도둑이 목도 조르고 그래서 아 손을 들어 머리를 헝클어트리고는 그대로 허공을 바라보는 그였다 <a href="http://www.nims.go.kr/flexer/view.jsp?FileDir=/DF779/&SystemFileName=20170220152120_0.pdf&ftype=pdf&FileName=소액결제현금화%20【OIO─8447─62O2】">소액결제 현금화</a> 꽤나 난감하다는 듯 한 표정이었는데 나를 슬쩍 바라본 그가 결국 일어나 네 일어나라고 명령조의 말을 내뱉었다 왜 그러나 싶어 주춤거리며 자리에서 일어서자마자 그가 내 손을 잡아서는 걸음을 옮기기 시작했고 그렇게 도착한 곳이 바로 출입을 불허했던 강태후의 방이었다 생각보다도 더욱 더 깨끗한 그의 방을 둘러보다 왜 여기로 데리고 왔나 싶어 슬쩍 그를 올려다본 내게 그는 조금 전 상황보다 <a href="https://jinro.gwe.go.kr/flexer/view.jsp?FileDir=/&SystemFileName=BBS_202112141024042341&ftype=pdf&FileName=%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%95%9C%EB%8F%84%EB%8C%80%EC%B6%9C%20%E3%80%90oIo-6338-7I24%E3%80%91%20%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%EC%B9%B4%EB%93%9C%EA%B9%A1">신용카드 한도 대출</a> 더욱 나를 놀라게 만들 말을 내뱉었다 침대에서 자 네 무섭다며 오늘 하루만이야 제가 침대에서 자면 바닥에서 하루 잔다고 안 죽어 당연히 안 죽죠 하지만 그 쪽이 그런 양보를 한다는 게 낯설다는 뜻이었어요 그래도 돼요 <a href="https://cylib.cne.go.kr/flexer/view.jsp?FileDir=%2fupload%2fboard%2fSITE_000000000000015%2fBBSMSTR_000000000001&SystemFileName=FILE_000000000053206_1&ftype=hwp&FileName=%EC%B9%B4%EB%93%9C%EA%B9%A1%20%E3%80%90oIo-6338-7I24%E3%80%91%20%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%95%9C%EB%8F%84%EB%8C%80%EC%B6%9C">카드깡</a> 눈치를 보며 내뱉은 말에 그는 또 다시 한숨을 내쉬었다 <a href="https://jinro.gwe.go.kr/flexer/view.jsp?FileDir=/&SystemFileName=BBS_202112141024042341&ftype=pdf&FileName=%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%E3%80%90oIo-6338-7I24%E3%80%91%20%EC%B9%B4%EB%93%9C%EA%B9%A1%20%EC%B9%B4%EB%93%9C%ED%98%84%EA%B8%88%ED%99%94%20%EC%8B%A0%EC%9A%A9%EC%B9%B4%EB%93%9C%ED%95%9C%EB%8F%84%EB%8C%80%EC%B6%9C">신용카드 현금화</a> 내 목에 난 상처를 뚫어지게 바라보는 걸로 봐서는 걱정이란 걸 하는 모양이</p>