hnwの日記

PHPのジェネレータはイテレータより速い


先日の記事「PHPのジェネレータの実装を調べてみた」で僕は次のように書きました。

GeneratorクラスはIteratorインターフェースを実装しており、対応するPHPメソッドを持っています。また、Cで実装した場合のみ指定できるイテレータ関数も実装しています。このように両方が指定されている場合、foreachループではCの関数が呼ばれ、イテレータメソッドを明示的に指定した場合はPHPメソッドの方が呼ばれます。


ところで、イテレータに対応するPHPメソッドとC関数となぜ2つとも実装する必要があるのでしょうか。実は、PHPメソッドの方だけ実装すれば正常に動作します。C関数を実装する理由は速度面のメリットからだというのが僕の理解です。C関数は関数ポインタで単に呼び出せるのに対し、PHPメソッドの呼び出しは命令実行器の状態保存・復元の必要があるなど、呼び出しのコストがやや高いのです。


PHPのジェネレータの実装を調べてみた - hnwの日記


PHPイテレータをforeach文でループさせる場合、内部的に呼ばれる処理の候補としてC関数とPHPメソッドと2種類あること、C関数の方が速度の観点で有利であること、ジェネレータを作った場合はC関数が使われることを紹介しています。


別の言い方をすると、PHPIteratorインターフェースを実装した場合は必ずPHPメソッドが使われますので、それよりは同じ動作のジェネレータを作った方が速いということになりそうです。本稿ではこれを確認してみましょう。

続きを読む