벤치마킹
CodeIgniter는 코드를 벤치마크하고 다양한 옵션을 테스트하는 데 도움이 되는 두 가지 별도의 도구를 제공합니다: Timer와 Iterator입니다. 타이머(Timer)는 스크립트 실행 중 두 지점 사이의 시간을 쉽게 계산할 수 있게 해 줍니다. 이터레이터(Iterator)는 여러 변형을 설정하고 해당 테스트를 실행하여 성능 및 메모리 통계를 기록함으로써 어떤 버전이 가장 좋은지 결정하는 데 도움을 줍니다.
Timer 클래스는 항상 활성 상태이며, 프레임워크가 호출되는 순간부터 사용자에게 출력을 보내기 직전까지 실행되어 전체 시스템 실행 시간을 매우 정확하게 측정할 수 있습니다.
타이머 사용
타이머를 사용하면 애플리케이션 실행 중 두 시점 사이의 시간을 측정할 수 있습니다. 이를 통해 애플리케이션의 다양한 측면의 성능을 간단하게 측정할 수 있습니다. 모든 측정은 start()와 stop() 메서드를 사용하여 이루어집니다.
Timer::start()
start() 메서드는 하나의 매개변수, 즉 이 타이머의 이름을 받습니다. 타이머 이름으로는 어떤 문자열이든 사용할 수 있습니다. 이는 나중에 어떤 측정값인지 참조하기 위해서만 사용됩니다:
<?php
$benchmark = service('timer');
$benchmark->start('render view');
Timer::stop()
stop() 메서드는 중지하려는 타이머의 이름을 유일한 매개변수로 받습니다:
<?php
$benchmark->stop('render view');
이름은 대소문자를 구분하지 않지만, 타이머를 시작할 때 지정한 이름과 일치해야 합니다.
timer()
또는 전역 함수인 timer()를 사용하여 타이머를 시작하고 중지할 수 있습니다:
<?php
// Start the timer
timer('render view');
// Stop a running timer,
// if one of this name has been started
timer('render view');
Timer::record()
Added in version 4.3.0.
v4.3.0부터는 매우 작은 코드 블록을 벤치마크하는 경우 record() 메서드를 사용할 수도 있습니다. 이 메서드는 매개변수가 없는 callable을 받아 실행 시간을 측정합니다. start()와 stop() 메서드는 함수 호출 전후에 자동으로 호출됩니다.
<?php
$benchmark->record('slow_function', static function () { slow_function('...'); });
/*
* Same as:
*
* $benchmark->start('slow_function');
* slow_function('...');
* $benchmark->stop('slow_function');
*/
나중에 처리하기 위해 callable의 반환값을 반환할 수도 있습니다.
<?php
$length = $benchmark->record('string length', static fn () => strlen('CI4'));
/*
* $length = 3
*
* Same as:
*
* $benchmark->start('string length');
* $length = strlen('CI4');
* $benchmark->stop('string length');
*/
timer()에 callable을 두 번째 매개변수로 전달할 때도 동일한 기능을 사용할 수 있습니다.
<?php
$length = timer('string length', static fn () => strlen('CI4'));
/*
* $length = 3
*
* Same as:
*
* timer('string length');
* $length = strlen('CI4');
* timer('string length');
*/
벤치마크 지점 확인
애플리케이션이 실행되면 설정한 모든 타이머가 Timer 클래스에 의해 수집됩니다. 단, 자동으로 표시되지는 않습니다. getTimers() 메서드를 호출하여 모든 타이머를 가져올 수 있습니다. 이 메서드는 시작, 종료, 지속 시간을 포함한 벤치마크 정보 배열을 반환합니다:
<?php
$timers = $benchmark->getTimers();
/*
* Produces:
* [
* 'render view' => [
* 'start' => 1234567890,
* 'end' => 1345678920,
* 'duration' => 15.4315, // number of seconds
* ]
* ]
*/
표시할 소수점 자릿수를 유일한 매개변수로 전달하여 계산된 지속 시간의 정밀도를 변경할 수 있습니다. 기본값은 소수점 이하 4자리입니다:
<?php
$timers = $benchmark->getTimers(6);
타이머는 디버그 툴바에 자동으로 표시됩니다.
실행 시간 표시
getTimers() 메서드가 프로젝트의 모든 타이머에 대한 원시 데이터를 제공하는 반면, getElapsedTime() 메서드를 사용하면 단일 타이머의 지속 시간을 초 단위로 가져올 수 있습니다. 첫 번째 매개변수는 표시할 타이머의 이름이고, 두 번째는 표시할 소수점 자릿수입니다. 기본값은 4입니다:
<?php
echo timer()->getElapsedTime('render view');
// Displays: 0.0234
이터레이터 사용
이터레이터는 솔루션의 여러 변형을 시험해 보고 속도 차이 및 메모리 사용 패턴의 차이를 확인할 수 있도록 설계된 간단한 도구입니다. 실행할 “작업”을 원하는 만큼 추가할 수 있으며, 클래스는 성능을 더 명확하게 파악하기 위해 해당 작업을 수백 또는 수천 번 실행합니다. 결과는 스크립트에서 가져와 사용하거나 HTML 테이블로 표시할 수 있습니다.
실행할 작업 생성
작업은 클로저(Closure) 내에 정의됩니다. 작업이 생성하는 모든 출력은 자동으로 버려집니다. add() 메서드를 통해 Iterator 클래스에 추가됩니다. 첫 번째 매개변수는 이 테스트를 참조할 이름이고, 두 번째 매개변수는 클로저 자체입니다:
<?php
$iterator = new \CodeIgniter\Debug\Iterator();
$iterator->add('double', static function ($word = 'little') {
"Some basic {$word} string test.";
});
작업 실행
실행할 작업을 추가한 후에는 run() 메서드를 사용하여 작업을 여러 번 반복 실행할 수 있습니다. 기본적으로 각 작업을 1000번 실행합니다. 이는 대부분의 간단한 테스트에 충분합니다. 그보다 더 많이 테스트를 실행해야 하는 경우 첫 번째 매개변수로 횟수를 전달할 수 있습니다:
<?php
// Run the tests 3000 times.
$htmlTable = $iterator->run(3000);
실행이 완료되면 테스트 결과가 담긴 HTML 테이블을 반환합니다. 결과가 필요 없다면 두 번째 매개변수로 false를 전달할 수 있습니다:
<?php
// Returns null.
$iterator->run(1000, false);