วัดประสิทธิภาพ
เมื่อมีฟังก์ชั่นที่เขียนขึ้นมาทั้ง 3 และใช้งานได้แล้ว ก็มาเขียนโค้ดสำหรับทดสอบ โดยชุดสตริงที่จะทดสอบจะต้องประกอบไปด้วยข้อมูลเหล่านี้
$strings = array(
'NTU1NQ==' => true,
'dGVzdA==' => true,
'aGVsbG8=' => true,
'4Liq4Lin4Lix4Liq4LiU4Li1' => true,
'5555' => false,
'test' => false,
'hello' => false,
'สวัสดี' => false,
)
ซึ่ง key ของ array จะมีสตริง base64 ที่ถูกต้องและไม่ถูกต้องปนกันไป. ค่าของ array จะเป็นการคาดหมายว่าข้อมูลนี้จะถูกต้อง (true
) หรือไม่ถูกต้อง (false
). และนอกจากนี้สามารถสร้าง string แบบสุ่มขึ้นมาชุดละ 20 ตัวอักษร เป็นภาษาอังกฤษและตัวเลข จำนวน 100 รายการ ซึ่งจะเป็นสตริง base64 ที่ไม่ถูกต้องทั้งหมด เพื่อทดสอบประสิทธิภาพของโค้ดที่ใช้ตรวจ. จากนั้นใช้โค้ดตรวจสอบดังต่อไปนี้.
<?php
// function isValidBase64 อยู่ตรงนี้
assert_options(ASSERT_BAIL, 1);
// debug functions. -------------------------------
/**
* Human readable file size.
*
* @link https://stackoverflow.com/a/15188082/128761
* @param int $size
* @param string $unit
* @return string
*/
function humanFileSize($size, $unit = "")
{
if ((!$unit && $size >= 1 << 30) || $unit == "GB")
return number_format($size / (1 << 30), 2) . " GB";
if ((!$unit && $size >= 1 << 20) || $unit == "MB")
return number_format($size / (1 << 20), 2) . " MB";
if ((!$unit && $size >= 1 << 10) || $unit == "KB")
return number_format($size / (1 << 10), 2) . " KB";
return number_format($size) . " bytes";
}
function indent($num = 1)
{
return str_repeat(' ', $num);
}
function printBenchmark($timeStart = 0)
{
$timeEnd = microtime(true);
$executionTime = ($timeEnd - $timeStart);
unset($timeEnd);
$memoryUse = memory_get_peak_usage();
echo 'PHP version: ' . PHP_VERSION . '<br>' . PHP_EOL;
echo 'execution time: ' . $executionTime . ' seconds.<br>' . PHP_EOL;
echo 'memory usage: ' . humanFileSize($memoryUse) . '.<br>' . PHP_EOL;
$backTrace = debug_backtrace();
$callerFile = ($backTrace[0]['file'] ? basename($backTrace[0]['file']) : __FILE__);
unset($backTrace);
echo 'file: ' . $callerFile . '<br>' . PHP_EOL;
if (!is_dir('logs')) {
mkdir('logs');
}
file_put_contents(
'logs/' . basename($callerFile) . '.txt',
PHP_VERSION . "\t" . $executionTime . "\t" . $memoryUse . PHP_EOL,
FILE_APPEND
);
writePHPLog($executionTime, $memoryUse, $callerFile);
}
function writePHPLog($executionTime, $memoryUse, $callerFile)
{
$output = '';
$logFile = 'logs/' . $callerFile;
if (!is_file($logFile)) {
$openPHP = true;
} else {
$contents = file_get_contents($logFile);
if (stripos($contents, '<?php') === false) {
$openPHP = true;
}
}
if (isset($openPHP) && $openPHP === true) {
$output .= '<?php' . PHP_EOL . PHP_EOL;
$output .= '$log = [];' . PHP_EOL;
}
unset($openPHP);
$output .= '$log[\'' . PHP_VERSION . '\'][] = [\'t\' => ' . $executionTime . ', \'m\' => ' . $memoryUse . ',];' . PHP_EOL;
file_put_contents($logFile, $output, FILE_APPEND);
}
// end debug functions. ---------------------------------
$timeStart = microtime(true);
// $strings = array(...);// ข้อมูลใช้ทดสอบอยู่ตรงนี้
foreach ($strings as $string => $assert) {
$decoded = base64_decode($string);
$isValid = isValidBase64($string);
echo '<strong>' . $string . '</strong> decoded: ' . str_replace(['<', '>'], ['<', '>'], (var_export($decoded, true))) . '<br>' . PHP_EOL;
echo indent() . 'is valid: ' . ($isValid === true ? '<span style="color: green;">YES</span>' : '<span style="color: red;">NO</span>') . '<br>' . PHP_EOL;
assert($isValid === $assert, 'Failed assert for ' . $string);
}
echo '<br>' . PHP_EOL;
printBenchmark($timeStart);
เมื่อทำการทดลองเรียกฟังก์ชั่นตรวจสอบแต่ละวิธี วิธีละ 3 ครั้ง โดยจากเครื่องที่ใช้ทดสอบนี้จะใช้ PHP 7.1, 7.4, 8.0 จะได้ผลลัพธ์ดังนี้
ผลการทดลองประสิทธิภาพ
htmlspecialchars |
||
PHP | เวลาที่ใช้ (วินาที) | หน่วยความจำที่ใช้ (KB) |
7.1.33 | 0.015239000320435 | 627.45 |
0.017446041107178 | 627.63 | |
0.014214992523193 | 627.63 | |
7.4.21 | 0.0085608959197998 | 663.47 |
0.008018970489502 | 663.59 | |
0.0080010890960693 | 663.59 | |
8.0.8 | 0.0081050395965576 | 663.56 |
0.00795578956604 | 663.69 | |
0.0082218647003174 | 663.69 | |
json_encode |
||
7.1.33 | 0.01386284828186 | 627.08 |
0.013746976852417 | 627.25 | |
0.014485120773315 | 627.25 | |
7.4.21 | 0.0079169273376465 | 663.16 |
0.0079128742218018 | 663.29 | |
0.0075619220733643 | 663.29 | |
8.0.8 | 0.0077497959136963 | 663.26 |
0.0075399875640869 | 663.38 | |
0.0083630084991455 | 663.38 | |
mb_convert_encoding |
||
7.1.33 | 0.018823146820068 | 627.13 |
0.017688035964966 | 627.30 | |
0.017730951309204 | 627.30 | |
7.4.21 | 0.011916160583496 | 663.10 |
0.011991024017334 | 663.23 | |
0.011780023574829 | 663.23 | |
8.0.8 | 0.0089950561523438 | 663.21 |
0.0089821815490723 | 663.34 | |
0.0099000930786133 | 663.34 |
โดยสรุปพบว่า json_encode()
ใช้ตรวจสอบ ทำความเร็วได้สูงสุดใน PHP ทุกรุ่น และตั้งแต่ที่ผู้เขียนได้ทดลองใช้มา ยังไม่พบข้อบกพร่องใดๆที่จะทำการตรวจสอบพลาด จึงอาจบอกได้ว่าวิธีนี้เป็นวิธีตรวจสอบว่าข้อมูล base64 ถูกเข้ารหัสแล้วหรือไม่ ได้ดีที่สุด.
สามารถเลือกใช้ซอร์สโค้ดในหน้านี้ได้ทุกจุดประสงค์หรือดาวน์โหลดจาก GitHub (Rundiz/Serializer) ผ่านปุ่มดาวน์โหลดด้านล่างนี้
ดาวน์โหลด