PHP PDF benchmark (mPDF, TCPDF, Dompdf)

การทดสอบรอบที่สอง

รอบที่สองนี้จะเป็นการวัดประสิทธิภาพสำหรับการสร้างเอกสารจำนวนหน้ามากๆ.

เงื่อนไขการวัดประสิทธิภาพ

  • ใช้ฟอนต์เดียวกันทั้งหมด ขนาด 12 pt.
  • จำนวนหน้าเอกสาร 100 หน้า.
  • กำหนดขนาดกระดาษที่ 8×5.5 นิ้ว.
  • กำหนดขนาดขอบกระดาษที่ 0.15 นิ้ว.

โค้ดที่ใช้ทดสอบ

{
    "require": {
        "mpdf/mpdf": "^8.0",
        "tecnickcom/tcpdf": "^6.3",
        "dompdf/dompdf": "^0.8.3"
    }
}

composer.json

<?php


require_once 'vendor/autoload.php';


$htmlcontent = <<< EOD
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <style>
            @font-face {
                font-family: 'thsarabun';
                src: url(fonts/THSarabunNew.ttf) format(\'truetype\');
            }
            body {
                font-family: 'thsarabun';
                font-size: 12pt;
            }
            h1, h2, h3, h4, h5, h6 {
                margin-top: 0;
                margin-bottom: 10px;
            }
            table {
                border: 1px solid #999;
                border-collapse: collapse;
            }
            table td,
            table th {
                border: 1px solid #999;
                text-align: left;
            }
        </style>
    </head>
    <body>
        {body}
    </body>
</html>
EOD;

$bodycontent = <<< EOD
<h1>Demo PDF</h1>
<table>
    <tbody>
        <tr>
            <td colspan="3">พันธุวิศวกรรมยูนิโคดไฮไลท์ สุนทรีย์ ลีเมอร์ลีเมอร์ฮองเฮาโปรดักชั่น โดนัท ซอร์สดีพาร์ทเมนท์ ป่าไม้ เหี่ยวย่นลูปสตรอเบอร์รีแคร์บาลานซ์ โน้ตบุ๊คเทเลกราฟภูมิทัศน์พฤหัสเรียลไทม์ ไลบรารี ดราม่าดิจิตอล บัตเตอร์โปสเตอร์อินเตอร์ เก๊ะสคริปต์เอาต์พุท แฟ็กซ์ลินุกซ์รวมมิตร โบว์ไลฟ์โน้ตบุคกระดี๊กระด๊า บร็อคโคลีจีพีเอสนรีแพทย์กูเกิ้ล สป็อตตัวตนฟอรัม โฮมแพลตฟอร์มบาร์บี้ ตรวจทาน ไฮแจ็คไลฟ์เบราว์เซอร์ฟล็อปส์สเตอริโอ เอาต์พุตมหภาคคีย์ทัวริสต์ เทรลเลอร์เทมเพลตแตงโม บล็อกเกอร์แฟ้บแกงค์โฟนเวสต์ ทัวริสต์บุ๋นบ็อกซ์ อัลไซเมอร์มอคค่าภควัมปติ อินเทอร์เฟซแอ็กชั่นกรุ๊ปฟอนต์ ศากยบุตรแตงโม ออยล์อาข่าเอฟเฟ็กต์แฮกเกอร์ อูบันตูเว็บเลเยอร์เซอร์เวอร์ชั่น แอพพลิเคชั่นออฟไลน์ เทมเพลตดาวน์เกรดแอพพลิเคชั่นแท็บอึ้ม แอปเปิลสแกน มิวสิคแฟ้บไนท์ฮาร์ดดิสก์ มิวสิค พะเรอไฟต์โซลูชั่นติวเตอร์เมาท์ ซื่อบื้อแอนิเมชันเฟิร์มเช็กเน็ตเวิร์ค</td>
        </tr>
        <tr>
            <td>ไฮไลท์ ภารตะ</td>
            <td rowspan="2">มีเดียเวิร์ดทรานแซกชั่นแฮปปี้</td>
            <td>เลกเชอร์พอร์ตเลิฟไวแมกซ์</td>
        </tr>
        <tr>
            <td>สมาพันธ์เป่ายิงฉุบ ดีพาร์ตเมนท์โดมิโน</td>
            <td>คอร์แบนด์วิดท์โมไบล์เป่ายิงฉุบ</td>
        </tr>
        <tr>
            <td>Celeste P. Washington</td>
            <td>6845 Aliquet. Rd.</td>
            <td>France</td>
        </tr>
        <tr>
            <td>Willow F. Duke</td>
            <td>1554 Erat St.</td>
            <td>Egypt</td>
        </tr>
        <tr>
            <td>Tarik R. Holland</td>
            <td>5496 Mi Rd.</td>
            <td>Hong Kong</td>
        </tr>
    </tbody>
</table>
{page}
EOD;
// ต้องมีเว้นวรรคบรรทัดล่างด้วย 1 บรรทัด

template-content-multipages.php

<?php

use Mpdf\Mpdf;

require 'template-content-multipages.php';


$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
$fontDirs = $defaultConfig['fontDir'];

$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
$fontData = $defaultFontConfig['fontdata'];

$Mpdf = new Mpdf([
    'fontDir' => array_merge($fontDirs, [
        __DIR__ . '/fonts',
    ]),
    'fontdata' => $fontData + [
        'thsarabun' => [
            'R' => 'THSarabunNew.ttf',
        ]
    ],
    'mode' => 'utf-8',
    'format' => [203.2, 139.7],//8.0*5.5 inch
    'margin_bottom' => 4,// 0.15 inch
    'margin_left' => 4,
    'margin_right' => 4,
    'margin_top' => 4,
    'orientation' => 'P',
    'default_font' => 'thsarabun',
    'default_font_size' => 12,
]);
for ($i = 1; $i <= 100; $i++) {
    $Mpdf->AddPage();
    $Mpdf->writeHTML(str_replace('{page}', $i, str_replace('{body}', $bodycontent, $htmlcontent)));
}
$Mpdf->Output(__FILE__ . '.pdf', 'F');


$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;

test06-mpdf-multiple.php

<?php

require 'template-content-multipages.php';


$TCPDF = new TCPDF('', 'in', [8, 5.5]);
$fontname = TCPDF_FONTS::addTTFfont(__DIR__ . '/fonts/THSarabunNew.ttf', 'thsarabun', '', 96);
$TCPDF->SetFont($fontname, '', 12);
$TCPDF->setPrintFooter(false);
$TCPDF->setPrintHeader(false);
$TCPDF->SetMargins(0.15, 0.15, 0.15);
$TCPDF->SetAutoPageBreak(true, 0.15);
for ($i = 1; $i <= 100; $i++) {
    $TCPDF->AddPage();
    $TCPDF->writeHTML(str_replace('{page}', $i, str_replace('{body}', $bodycontent, $htmlcontent)));
}
$TCPDF->Output(__FILE__ . '.pdf', 'F');


$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;

test07-tcpdf-multiple.php

<?php
ini_set('memory_limit','64M');
ini_set('max_execution_time', '300');

use Dompdf\Css\Style;
use Dompdf\Css\Stylesheet;
use Dompdf\Dompdf;

require 'template-content-multipages.php';


$Dompdf = new Dompdf();
$Dompdf->setPaper([0, 0, 576, 396]);
$Stylesheet = new Stylesheet($Dompdf);
$Style = new Style($Stylesheet);
$Style->set_margin('10.8pt');
$Stylesheet->add_style('html', $Style);
unset($Style);
$Style = new Style($Stylesheet);
$Style->set_page_break_before('always');
$Stylesheet->add_style('.body-page', $Style);
$Dompdf->setCss($Stylesheet);
$bodyPages = '';
for ($i = 1; $i <= 100; $i++) {
    $bodyPages .= '<div' . ($i > 1 ? ' class="body-page"' : '') . '>' . str_replace('{page}', $i, $bodycontent) . '</div>';
}
$Dompdf->loadHtml(str_replace('{body}', $bodyPages, $htmlcontent));
$Dompdf->render();
$pdfContent = $Dompdf->output();
file_put_contents(__FILE__ . '.pdf', $pdfContent);


$executionTime = microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"];
echo 'time spent: ' . $executionTime . ' seconds<br>' . PHP_EOL;
echo 'memory usage: ' . memory_get_peak_usage() . ' bytes<br>' . PHP_EOL;

test08-dompdf-multiple.php

ผลการทดสอบ

ชื่อและประเภทการทดสอบ ครั้งที่ 1 ครั้งที่ 2 ครั้งที่ 3
mPDF time 21.168452978134 21.185007095337 21.247757911682
mPDF memory 15691296 15691440 15691440
mPDF ขนาดไฟล์ 277 KB
TCPDF time 18.786734104156 18.544844865799 18.829990148544
TCPDF memory 10454648 10454648 10454504
TCPDF ขนาดไฟล์ 315 KB
Dompdf time 39.982146978378 40.299237966537 40.522968053818
Dompdf memory 37230408 37230552 37230552
Dompdf ขนาดไฟล์ 376 KB

จากผลการทดสอบรอบที่สอง ด้านความเร็วต้องยกให้ TCPDF, ด้านการใช้หน่วยความจำน้อยที่สุดต้องยกให้ TCPDF, ขนาดไฟล์ที่เล็กที่สุดต้องยกให้ mPDF.

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>