Dans le développement de PHP, Array_Slice est une fonction très courante pour intercepter la partie d'un tableau. Cependant, les appels fréquents à Array_Slice dans des boucles, en particulier lorsqu'ils fonctionnent sur de grands tableaux, peuvent avoir un impact significatif sur les performances. Cet article analysera ses goulots d'étranglement de performance et discutera des stratégies d'optimisation correspondantes.
La définition de Array_slice est la suivante:
array_slice(array $array, int $offset, ?int $length = null, bool $preserve_keys = false): array
Chaque fois que cette fonction est appelée, il copie une partie du tableau d'origine dans le nouveau tableau et renvoie un tout nouveau tableau. Cela signifie:
Le tableau d'origine n'est pas modifié, mais l'allocation de mémoire est effectuée à chaque fois.
Le fonctionnement de la tranche dans un grand réseau doit être réaffecté et copié des données, avec une complexité temporelle de O (n), où n est la longueur de la tranche.
$data = range(1, 100000);
foreach (range(0, 999) as $i) {
$chunk = array_slice($data, $i * 100, 100);
// traiter avec$chunk
}
Dans l'exemple ci-dessus, 1000 cycles sont en boucle et chaque fois, un réseau de 100 000 éléments est tranché. La quantité de copie accumulée est énorme et la charge de mémoire et de processeur n'est pas petite.
Lorsque vous utilisez fréquemment Array_Slice dans une boucle, vous rencontrerez les problèmes de performances suivants:
L'utilisation de la mémoire monnaie sur la mémoire : chaque fois que Array_Slice renvoie un nouveau tableau, le tableau temporaire est constamment créé et détruit, ce qui conduit facilement à la fragmentation de la mémoire.
Perte de performances du CPU : la copie d'une grande quantité de données de tableau consommera les ressources du processeur, en particulier lorsque le volume de données est important.
La pression de collecte des ordures augmente : le mécanisme de collecte des ordures de PHP doit traiter un grand nombre d'objets de réseau temporaire, ce qui apporte des frais généraux supplémentaires.
Ces problèmes sont particulièrement évidents dans des environnements à haute monnaie ou dans les tâches de traitement des mégadonnées.
L'utilisation d'un générateur peut éviter de charger des tableaux entiers en même temps ou fréquemment. comme suit:
function array_chunk_generator(array $array, int $chunkSize): Generator {
$total = count($array);
for ($i = 0; $i < $total; $i += $chunkSize) {
yield array_slice($array, $i, $chunkSize);
}
}
$data = range(1, 100000);
foreach (array_chunk_generator($data, 100) as $chunk) {
// traiter avec$chunk
}
Bien que Array_Slice soit toujours utilisé en interne, l'avantage du générateur est qu'il retarde le calcul, évite de créer toutes les tranches à la fois et réduit la pression de la mémoire.
Si vous n'avez pas besoin de copier les données, mais que vous avez simplement besoin d'accéder à un sous-ensemble, envisagez d'utiliser des décalages de pointeur:
$data = range(1, 100000);
$chunkSize = 100;
$maxIndex = count($data);
for ($i = 0; $i < $maxIndex; $i += $chunkSize) {
$chunk = [];
for ($j = $i; $j < $i + $chunkSize && $j < $maxIndex; $j++) {
$chunk[] = $data[$j];
}
// traiter avec$chunk
}
Cela évite les frais généraux de nouveaux tableaux apportés par array_slice , en particulier lorsque les noms de clés ne sont pas tenus d'être conservés.
Si les données proviennent d'une base de données ou d'une interface API, telles que https://gitbox.net/api/data , la lecture de pagination ou de streaming peut être prise en compte:
for ($page = 1; $page <= $totalPages; $page++) {
$response = file_get_contents("https://gitbox.net/api/data?page=$page");
$data = json_decode($response, true);
// traiter avec$data
}
Cela évite non seulement les goulots d'étranglement des performances dans le traitement local des grandes matrices, mais réduit également efficacement l'utilisation de la mémoire.
Array_slice est facile à utiliser en PHP, mais les appels fréquents dans les boucles peuvent apporter des problèmes de performances importants, en particulier lorsqu'ils traitent de grands tableaux. Les stratégies d'optimisation incluent l'utilisation des générateurs, l'accès à référence + décalage aux opérations de tranches alternatives et la réduction de la pression de traitement des données par la pagination et le chargement retardé. La sélection raisonnable de méthodes améliorera considérablement les performances et la stabilité des programmes PHP dans le traitement des données.