Lors du traitement des données binaires en PHP, deux méthodes couramment utilisées sont d'utiliser la fonction intégrée () et d'épisser manuellement les chaînes (en utilisant des opérations de chaîne pour combiner des données binaires). De nombreux développeurs se demanderont dans le développement réel: l'efficacité d'exécution de Pack () est-elle vraiment plus élevée que l'épissage manuel? Cet article utilisera des tests de code et combinera quelques tests de performances simples pour aider tout le monde à clarifier ce problème.
Pack () est une fonction PHP intégrée qui est utilisée pour emballer les données dans des chaînes binaires dans le format spécifié. Les paramètres de format sont flexibles et directs.
L'épissage manuel consiste à construire manuellement les données binaires à l'aide de fonctions de chaîne (telles que Chr () , les opérations de bits, etc.).
Les deux peuvent obtenir des effets similaires en termes de fonction, mais la méthode d'implémentation est différente du traitement sous-jacent.
Nous testerons la surcharge de temps de deux méthodes lors de l'emballage de grandes quantités de données. L'exemple spécifique est d'emballer un grand nombre d'entiers non signés 32 bits comme exemple. Les tests sont divisés en:
Emballez un seul entier à l'aide de Pack ('n', $ num) .
Utilisez Chr () pour combiner les opérations de bits pour épisser manuellement quatre octets.
Les codes sont tous exécutés 1 million de fois dans une boucle, enregistrant le décalage horaire.
<?php
$iterations = 1000000;
$numbers = range(0, $iterations - 1);
// test pack() Paquet
$startPack = microtime(true);
$resultPack = '';
foreach ($numbers as $num) {
$resultPack .= pack('N', $num);
}
$endPack = microtime(true);
$timePack = $endPack - $startPack;
// test手动拼接
$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;
// Résultat de sortie
echo "<code>pack() Les méthodes prennent du temps: {$timePack} Deuxième\n</code>";
echo "<code>手动拼接Les méthodes prennent du temps: {$timeManual} Deuxième\n</code>";
?>
Dans plusieurs tests, vous trouverez généralement:
Pack () exécute un peu plus rapidement , en particulier lorsqu'il s'agit de formats complexes et de grands lots de données.
Les coutures manuelles sont légèrement moins efficaces en raison de la concaténation multiple des cordes et des opérations de bit.
Mais l'écart entre les deux ne sera pas particulièrement énorme, et le code d'épissage manuel est relativement long et sujet aux erreurs.
Pack () est la fonction sous-jacente implémentée en C La mémoire et l'optimisation du processeur pendant l'exécution sont plus efficaces que les opérations de chaîne au niveau PHP. Bien que la couture manuelle soit intuitive, chaque fois que vous connectez la chaîne, une nouvelle copie de la chaîne sera générée (fonctionnalité immuable de chaîne PHP), entraînant une dégradation des performances.
Il est recommandé d'utiliser Pack () , qui a du code concis, une grande lisibilité et présente des avantages dans les performances.
Les coutures manuelles ne sont prises en compte que lorsque le réglage des performances extrêmes et le contrôle très méticuleux des octets sous-jacents.