8

Zend Framework 2 では、ファクトリ クラスとクロージャのどちらを使用する方が良いですか? また、その理由は?

クロージャーをシリアル化できないことはわかっていますが、Module#getServiceConfig() からそれらを返す場合、これは構成データの残りのキャッシュに影響を与えず、クロージャーはとにかくオペコード キャッシュにキャッシュされます。

ファクトリ クラスの構築とクロージャの実行でパフォーマンスはどのように異なりますか? PHP はクロージャーを実行するときだけラップしてインスタンス化しますか?それとも、リクエストごとに構成ファイルで定義されたすべてのクロージャーに対してこれを行いますか?

各メソッドの実行時間を比較した人はいますか?

以下も参照してください。

4

1 に答える 1

11

PHP は、構成内の無名関数をコンパイル時にクロージャー クラスのインスタンスに変換するため、すべての要求でこれを行います。create_functionこれは、実行時に関数を作成するものとは異なります。ただし、クロージャーはコンパイル時にこれを行うため、opcache キャッシュにある必要があり、問題にはなりません。

ファクトリとクロージャーを使用してサービスを構築することのパフォーマンスへの影響に関しては、まず、サービスを要求した回数に関係なく、サービスは要求ごとに 1 回しか構築されないことを覚えておく必要があります。クロージャとファクトリを使用してサービスを取得する簡単なベンチマークを実行したところ、次の結果が得られました (数回実行したところ、すべての結果がほぼ同じ値でした)。

Closure: 0.026999999999999ns
Factory: 0.30200000000002ns

これらはナノ秒、つまり 10 -9秒です。基本的に性能差は小さいので、実質的な差はありません。

また、ZF2 はモジュール全体の構成をクロージャーでキャッシュできません。純粋にファクトリを使用すると、毎回構成ファイルをロードしてマージすることを心配するのではなく、構成全体をマージしてキャッシュし、要求ごとに単純なファイルを読み取ることができます。これによるパフォーマンスへの影響は測定していませんが、いずれにしてもごくわずかだと思います。

ただし、主に可読性と保守性のためにファクトリを好みます。ファクトリを使用すると、大量のクロージャーがあちこちにある大規模な構成ファイルになることはありません。

確かに、クロージャーは迅速な開発には最適ですが、コードを読みやすく、保守しやすいものにしたい場合は、ファクトリに固執することをお勧めします。

于 2013-10-21T00:00:47.680 に答える