Heim  >  Artikel  >  Backend-Entwicklung  >  Einfache Analyse von PHP-Generator-Generatoren

Einfache Analyse von PHP-Generator-Generatoren

不言
不言Original
2018-08-04 09:28:461727Durchsuche

Dieser Artikel stellt Ihnen eine einfache Analyse von PHP-Generatoren vor. Er hat einen gewissen Referenzwert. Ich hoffe, er wird Ihnen hilfreich sein.

Was sind Generatoren?

Generatoren ermöglichen es Ihnen, Code in einen foreach-Block zu schreiben, um einen Datensatz zu durchlaufen, ohne ein Array im Speicher zu erstellen, das Sie erreichen wird den Speicher begrenzen oder erhebliche Verarbeitungszeit in Anspruch nehmen. Stattdessen können Sie eine Generatorfunktion schreiben, genau wie eine normale benutzerdefinierte Funktion, und statt einer normalen Funktion, die nur einmal zurückgibt, kann der Generator so oft wie nötig nachgeben, um die Werte zu generieren, über die iteriert werden muss.

Ein einfaches Beispiel ist die Verwendung eines Generators zur Neuimplementierung der Funktion range(). Die Standardfunktion range() muss ein Array im Speicher generieren, das jeden Wert innerhalb seines Bereichs enthält, und dann das Array zurückgeben, was zu mehreren großen Arrays führt. Der Aufruf von „range(0, 10000)“ führt beispielsweise dazu, dass die Speichernutzung 4 MB überschreitet.

Beispielcode:

<?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];
}

Environment

  • PHP7.1

  • b

php test.php range Ergebnisrückgabe: Speicherverbrauch 4 MB

  • Testergebnisdiskussion

  • Vergleichen Sie durch die Ausführung des Codes die Ähnlichkeiten und Unterschiede zwischen der PHP-Standardfunktion rang() und der benutzerdefinierten Funktion rangeWithGenerators(). Die Vorteile des Generators liegen auf der Hand, da er den gleichen Zweck erfüllt, aber unterschiedlichen Speicher verbraucht.

rangeWithGenerators() verwendet einen Generator, und der Schlüssel zum Generator ist die Verwendung des Schlüsselworts yield. Die übliche Verwendung von yield umfasst zwei Flusskontrollanweisungen, foreach und for. Die Yield-Variable $i in der for-Schleife in rangeWithGenerators() (Yield kann als Generierung eines Werts verstanden werden, genauso wie Return als Rückgabe eines Werts verstanden werden kann).

    rangeWithGenerators()-Funktion gibt einen Generatorgeneratoren zurück (verwenden Sie var_dump($iterate), um seinen Typ anzuzeigen).
  • Da die Funktion rangeWithGenerators() einen Generator zurückgibt, können wir ihn auf die folgenden zwei Arten verwenden:
  • foreach durchläuft die Generatoren. In diesem Beispiel wird diese Methode zum Lesen der Generatoren verwendet.

  • PHP-Standardfunktion iterator_to_array(), diese Funktion wandelt Generatoren in ein Array um.

    Empfohlene verwandte Artikel:
  1. Einführung in die Verwendung von json_encode in PHP
  2. Wie man Curl verwendet POST in PHP empfangen Die Adresse ist die Methode zum Erstellen einer Schnittstelle

Das obige ist der detaillierte Inhalt vonEinfache Analyse von PHP-Generator-Generatoren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn