ホームページ >バックエンド開発 >PHPチュートリアル >PHPジェネレーターの簡単な解析

PHPジェネレーターの簡単な解析

不言
不言オリジナル
2018-08-04 09:28:461760ブラウズ

この記事では、PHP ジェネレーターの簡単な分析を紹介します。一定の参考価値があります。困っている友人は参考にしてください。お役に立てれば幸いです。

ジェネレーターとは

ジェネレーターを使用すると、メモリ内に配列を作成せずに、foreach ブロックにコードを記述して、一連のデータを反復処理できます。メモリ制限があるか、かなりの処理時間がかかる可能性があります。代わりに、通常のカスタム関数と同じようにジェネレーター関数を作成できます。通常の関数が 1 回だけ返すのではなく、ジェネレーターは必要に応じて何度でも生成して、反復する必要がある値を生成できます。

簡単な例は、ジェネレーターを使用して range() 関数を再実装することです。標準の range() 関数は、範囲内のすべての値を含む配列をメモリ内に生成し、その配列を返す必要があるため、複数の大きな配列が生成されます。たとえば、 range(0, 10000) を呼び出すと、メモリ使用量が 4 MB を超えます。

コード例:

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

環境

  • PHP7.1

  • Xdebug

コマンドを実行

  • php test.php 結果が返されます: メモリ消費量416 b

  • php test.php range 結果の戻り値: メモリ消費量 4 mb

テスト結果の説明

  • #コードの実行を通じて、PHP 標準関数 rang() とカスタム関数 rangeWithGenerators() の類似点と相違点を比較します。同じ目的を達成しても、消費するメモリが異なるため、ジェネレーターの利点は明らかです。

  • rangeWithGenerators() はジェネレータを使用します。ジェネレータのキーは、yield キーワードを使用することです。yield の一般的な使用には、foreach と for という 2 つのプロセス制御ステートメントが含まれます。 rangeWithGenerators() の for ループ内の yield 変数 $i (return が値を返すと理解できるのと同じように、yield は値を生成すると理解できます)。

  • rangeWithGenerators() 関数は、ジェネレーター Generators を返します (その型を表示するには、var_dump($iterate) を使用します)。

  • rangeWithGenerators() 関数はジェネレーターを返すため、次の 2 つの方法で使用できます。

  1. foreach はジェネレーターをループします。この例では、このメソッドはジェネレーターを読み取るために使用されます。

  2. PHP 標準関数 iterator_to_array()、この関数はジェネレーターを配列に変換します。

おすすめの関連記事:

PHP での json_encode の使用法についての紹介

カールを使用して次のことを行う方法POSTでPOSTを受け取る アドレスはインターフェイスを作成するメソッドです

以上がPHPジェネレーターの簡単な解析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。