보다 빠른 echo를 위하여

PHP 언어에서 print 보다 echo가 빠르다는 것은 널리 알려진 사실이다. 이런 차이는 print의 경우 반환값이 존재하기 때문인데, 물론 이런 반환값 때문에 수식 내에서 사용 할 수 있다는 장점도 있다. 예를 들어 $result = ($n > 1) ? $n : print $n;처럼 쓸 수 있다.

그럼 echo는 어떻게 사용해도 똑같을까? 그렇지는 않다. echo 또한 어떻게 사용하느냐에 따라 속도가 다르다.

1
2
<?php
echo "1","2","3","\n";
1
2
<?php
echo "1"."2"."3"."\n";

이 두 코드는 완전히 동일한 결과를 출력하지만, 후자가 더 빠르고 바람직 하다.

좀 더 자세히 이야기 하자면 첫번째 코드는 ‘1’, ‘2’, ‘3’, ‘4’를 각각 출력한다. 정확히는 각 문장마다 write() 시스템 콜을 4번 호출한다.

후자는 4개 문장을 하나로 합친 후에 write()를 1번 호출한다. 후자는 1번만 호출하기 때문에 시스템 콜에 대한 오버헤드가 1번만 발생하고, 커널 영역에 진입하는 횟수가 상대적으로 적다. 사용자 영역에서 커널 영역으로 진입하는 횟수가 많은 것이 좋지 않다. 직접 확인을 해보고 싶은 사람은 strace로 시스템 콜을 확인 해 보는 것도 추천한다.

그럼 도트(concatenation) 연산자를 사용하는 것이 최선의 방법일까? 엄밀히 말하면 모든 경우에 그렇지는 않다.

1
2
3
4
5
6
<?php
$a = 1;
$b = 2;
$c = 3;

echo $a.$b.$c."\n";
1
2
3
4
5
<?php
$a = 1;
$b = 2;
$c = 3;
echo "{$a}{$b}{$c}\n";

이 두 코드를 비교하면 전자 보다 후자가 빠르다. 그 이유는 도트 연산자가 두 번 이상 등장하면 연산 작업을 중복하여 여러번 수행하는 문제가 있기 때문이다. 도트를 사용하는 횟수에 따라 급격히 연산 작업 횟수가 증가하므로 다수의 변수를 합친다면 비효율적인 된다.

그러므로 두 번 이상 도트를 사용하여 문자열을 출력해야 하는 경우 중괄호를 사용해서 문자열 내에서 처리를 하는 것이 빠르다. 이 문제는 합치기 연산 횟수에 관련된 것이므로 꼭 echo 문이 아니라 변수에 대입하는 경우도 동일하다.

지금까지 도트 연산자를 주로 사용했다면 앞으로는 중괄호를 사용하는 습관을 들여보도록 하자.

updatedupdated2021-01-042021-01-04