Heim > Artikel > Backend-Entwicklung > Einfache Analyse von PHP-Generator-Generatoren
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('Step must be +ve'); } 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
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).
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.
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!