Maison  >  Article  >  développement back-end  >  Analyse simple du générateur PHP Générateurs

Analyse simple du générateur PHP Générateurs

不言
不言original
2018-08-04 09:28:461659parcourir

Cet article vous présente une analyse simple des générateurs PHP. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Que sont les générateurs

Les générateurs vous permettent d'écrire du code dans un bloc foreach pour parcourir un ensemble de données sans créer de tableau en mémoire, qui atteindra votre limiter la mémoire ou prendre un temps de traitement considérable. Au lieu de cela, vous pouvez écrire une fonction génératrice, tout comme une fonction personnalisée normale, et au lieu qu'une fonction normale ne renvoie qu'une seule fois, le générateur peut produire autant de fois que nécessaire pour générer les valeurs qui doivent être itérées.

Un exemple simple consiste à utiliser un générateur pour réimplémenter la fonction range(). La fonction standard range() doit générer un tableau en mémoire contenant toutes les valeurs comprises dans sa plage, puis renvoyer le tableau, ce qui donne lieu à plusieurs grands tableaux. Par exemple, l’appel de range(0, 10000) entraînera une utilisation de la mémoire supérieure à 4 Mo.

Exemple de code :

<?php
/**
 * Created by PhpStorm.
 * User: chenbotome@163.com
 * Date: 2018/7/30
 * Time: 上午11:29
 */
$start = xdebug_memory_usage();
$num = 10000;
function rangeWithGenerators($start, $limit, $step = 1) {
    if ($start < $limit) {
        if ($step <= 0) {
            throw new LogicException(&#39;Step must be +ve&#39;);
        }

        for ($i = $start; $i <= $limit; $i += $step) { 
        yield $i;
        }
         } else { 
         if ($step >= 0) {
            throw new LogicException('Step must be -ve');
        }

        for ($i = $start; $i >= $limit; $i += $step) {
            yield $i;
        }
    }
}
if ($argc === 1) {
    $iterate = rangeWithGenerators(0, $num, 1);
    foreach ($iterate as $value){
        echo $value . "\n";
    }
    //var_dump(iterator_to_array($iterate));
}
if ($argc === 2) {
    $test = range(0, $num, 1);
    foreach ($test as $value) {
        echo $value . "\n";
    }
}
$end = xdebug_memory_usage();

echo sprintf("内存消耗量%s\n", convert($end-$start));

function convert($size){
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

Environnement

  • PHP7.1

  • Montant 416 b

php test.php plage Résultat retour : Consommation mémoire 4 Mo

  • Discussion sur les résultats du test

  • Grâce à l'exécution du code, comparez les similitudes et les différences entre la fonction standard PHP rang() et la fonction personnalisée rangeWithGenerators(). Atteignant le même objectif mais consommant une mémoire différente, les avantages du générateur sont évidents.

rangeWithGenerators() utilise un générateur, et la clé du générateur est d'utiliser le mot-clé rendement. L'utilisation courante de rendement implique deux instructions de contrôle de flux, foreach et for. La variable de rendement $i dans la boucle for de rangeWithGenerators() (le rendement peut être compris comme la génération d'une valeur, tout comme le retour peut être compris comme le retour d'une valeur). La fonction

    rangeWithGenerators() renvoie un générateur Generators (utilisez var_dump($iterate) pour afficher son type).
  • Puisque la fonction rangeWithGenerators() renvoie un générateur, nous pouvons l'utiliser des deux manières suivantes :
  • foreach boucle les générateurs. Dans cet exemple, cette méthode est utilisée pour lire les générateurs.

  • Fonction standard PHP iterator_to_array(), cette fonction convertit les générateurs en un tableau.

    Articles connexes recommandés :
  1. Introduction à l'utilisation de json_encode en PHP
  2. Comment utiliser curl pour recevoir du POST en PHP L'adresse est la méthode pour créer une interface

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn