맛집 여행 캠핑 일상 생활

PHP fread vs readfile vs fpassthru 속도 비교 본문

LAMP

PHP fread vs readfile vs fpassthru 속도 비교

영은파더♥ 2016. 9. 7. 17:59

PHP fread vs readfile vs fpassthru 속도 비교


비교해 보기 위해서 아래와 같이 함수를 만들고 테스트를 진행하였습니다.

테스트에 사용된 이미지는 3,995,958 바이트 jpg 입니다. 해상도는 2000 x 1437

function image_view1($img_path) {

$IMAGE_PATH = $img_path;

$IMAGE_SIZE = getimagesize($IMAGE_PATH);

$fp = fopen($IMAGE_PATH,"rb");

while(!feof($fp)) {

$iraw .= fread($fp,8192);

}

fclose($fp);

echo "<img src='data:".$IMAGE_SIZE['mime'].";base64,".base64_encode($iraw)."'>";

}


function image_view2($img_path) {

$IMAGE_PATH = $img_path;

$IMAGE_SIZE = getimagesize($IMAGE_PATH);

ob_start();

readfile($IMAGE_PATH);

$iraw = ob_get_clean();

echo "<img src='data:".$IMAGE_SIZE['mime'].";base64,".base64_encode($iraw)."'>";

}


function image_view3($img_path) {

$IMAGE_PATH = $img_path;

$IMAGE_SIZE = getimagesize($IMAGE_PATH);

ob_start();

$fp = fopen($IMAGE_PATH,"rb");

if($fp) fpassthru($fp);

fclose($fp);

$iraw = ob_get_clean();

echo "<img src='data:".$IMAGE_SIZE['mime'].";base64,".base64_encode($iraw)."'>";

}


아래는 테스트를 진행한 코드입니다. ( 각각 테스트 )

$st = microtime(true);

for($i=0; $i<10; $i++) image_view1($_POST['url']);

$et = microtime(true);

printf("Loading time 1 : %0.4f", $et - $st);


$st = microtime(true);

for($i=0; $i<10; $i++) image_view2($_POST['url']);

$et = microtime(true);

printf("Loading time 2 : %0.4f", $et - $st);


$st = microtime(true);

for($i=0; $i<10; $i++) image_view3($_POST['url']);

$et = microtime(true);

printf("Loading time 3 : %0.4f", $et - $st);


각 함수별로 두번씩 테스트한 결과입니다.

Loading time 1 : 18.7244

Loading time 1 : 18.5084


Loading time 2 : 18.9206

Loading time 2 : 19.0508


Loading time 3 : 18.6121

Loading time 3 : 18.5669

평균이랄 것도 없지만 fpassthru 가 아주 미세하게 조금 더 빠르고 다음이 fread, 제일 느린게 readfile 이였습니다.

속도 차이가 그렇게 크지 않아서 별 의미는 없겠지만, 가급적이면 fpassthru 와 fread 를 사용하는게 좋을 것 같다는 결론입니다.

대신에 fread 는 버퍼를 8k 로 해야 저 속도지 4096 으로 하면 좀 더 느린 결과를 보입니다.


테스트 환경 및 이미지 파일에 따라 결과는 달라질 수도 있을 겁니다.


ps : 576,054 바이트 bmp 파일로 테스트한 결과

for 문을 20으로 바꿔서 테스트 하였음.

Loading time 1 : 0.8390

Loading time 2 : 0.7939

Loading time 3 : 0.7502


php 버전 : PHP 5.3.3


Trackback : | Comments :