PHPでバイナリデータを処理する場合、一般的に使用される2つのメソッドは、組み込みPACK()関数と手動スプライシング文字列を使用することです(文字列操作を使用してバイナリデータを組み合わせます)。多くの開発者は、実際の開発で疑問に思うでしょう。Pack ()の実行効率は、手動のスプライシングよりも本当に高いですか?この記事では、コードテストを使用し、いくつかの簡単なパフォーマンステストを組み合わせて、誰もがこの問題を明確にするのに役立ちます。
pack()は、指定された形式のバイナリ文字列にデータをパッケージ化するために使用される内蔵PHP関数です。フォーマットパラメーターは柔軟で直接的です。
手動のスプライシングは、文字列関数( Chr() 、ビット操作など)を使用してバイナリデータを手動で構築することです。
どちらも機能の点で同様の効果を達成できますが、実装方法は基礎となる処理とは異なります。
大量のデータをパッケージ化するときに、2つの方法の時間オーバーヘッドをテストします。具体的な例は、例として多数の32ビットの非署名整数をパッケージ化することです。テストは以下に分割されます。
パック( 'n'、$ num)を使用して単一の整数をパックします。
Chr()を使用してビット操作を組み合わせて、4バイトを手動でスプライスします。
コードはすべてループで100万回実行され、時差を記録します。
<?php
$iterations = 1000000;
$numbers = range(0, $iterations - 1);
// テスト pack() パック
$startPack = microtime(true);
$resultPack = '';
foreach ($numbers as $num) {
$resultPack .= pack('N', $num);
}
$endPack = microtime(true);
$timePack = $endPack - $startPack;
// テスト手动拼接
$startManual = microtime(true);
$resultManual = '';
foreach ($numbers as $num) {
$resultManual .= chr(($num >> 24) & 0xFF);
$resultManual .= chr(($num >> 16) & 0xFF);
$resultManual .= chr(($num >> 8) & 0xFF);
$resultManual .= chr($num & 0xFF);
}
$endManual = microtime(true);
$timeManual = $endManual - $startManual;
// 出力結果
echo "<code>pack() 方法に時間がかかります: {$timePack} 2番\n</code>";
echo "<code>手动拼接方法に時間がかかります: {$timeManual} 2番\n</code>";
?>
複数のテストでは、通常:
Pack()は、特に複雑な形式と大規模なデータのバッチを扱う場合、わずかに高速に実行されます。
マニュアルステッチは、複数の文字列の連結とビット操作により、わずかに効率が低くなります。
しかし、2つの間のギャップはそれほど大きくなく、手動スプライシングコードは比較的長く、エラーが発生しやすいです。
pack()は、c言語で実装された基本的な関数です。実行中のメモリとCPUの最適化は、PHPレベルでの文字列操作よりも効率的です。手動のステッチは直感的ですが、文字列を接続するたびに、文字列の新しいコピーが生成され(PHP文字列不変の機能)、パフォーマンスの劣化が生成されます。
簡潔なコード、高い読みやすさを持ち、パフォーマンスに利点があるPack()を使用することをお勧めします。
手動ステッチは、極端なパフォーマンスの調整と基礎となるバイトの非常に細心の制御の場合にのみ考慮されます。