私はカスタムビルドの MVC PHP フレームワークを持っており、それを書き直している最中で、パフォーマンスと魔法のメソッドについて質問がありました。フレームワークのモデル部分について、魔法のメソッドを使用するとパフォーマンスが大幅に低下するのではない__get
かと考えていました。__set
つまり、モデル データへのアクセス (読み取りと書き込み) は、実行される最も一般的な作業の 1 つになるということです。__get
/マジック メソッドの使用__set
は、MVC フレームワークのモデル部分のような頻繁に使用される機能に対してパフォーマンス ヒットが大きすぎますか?
4 に答える
それを測定します。
特に関数呼び出しが PHP で高価であることを考えると、パフォーマンスが大幅に低下することは間違いありません。この違いは、次のバージョンの PHP ではさらに大きくなり、宣言されたインスタンス プロパティへの通常のアクセスを大幅に高速化する最適化が実装されます。
とはいえ、PHP がボトルネックになることはめったにありません。多くの場合、I/O およびデータベース クエリにはさらに時間がかかります。ただし、これは使用状況によって異なります。ベンチマークすることを確実に知る唯一の方法。
これは、魔法のメソッドの他の可読性の問題でもあります。それらは頻繁に 1 つの大きなswitch
ステートメントに縮退し、コードの補完を危うくします。どちらもプログラミングの生産性に打撃を与える可能性があります。
これは、いくつかのベンチマークを含む記事(3 年前) です。独自のテストを実行して、コードへの影響を確認してください。
一般的に言えば、それらははるかに遅いです。しかし、それらはボトルネックですか?それはあなたが何をしているかによります。速度が気になる場合は、どこで停止しますか? ループはforeach
ループよりも遅くなりますがfor
、ほとんどの人は、すべてのコードを書き直してfor
.
PHP を使用するだけで、コードの速度はそれほど重要ではありません。個人的には、プログラミングを容易にするスタイルなら何でも好みます。
純粋に私の経験から言えば、かなりのオーバーヘッドが追加されます。約 4000__get
のページ (はい、そのページには非常に多くのデータがありました) では、パフォーマンスがかなり遅くなり、許容できないほどになりました。他のデータの変更や外部依存関係 (外部キーなど) のチェックを必要としない変数__set
の &をすべて捨てました。その後、そのページを生成する時間は、かかった時間の約 15% でした。__get
前。
私はちょうどこれと同じ質問を自問し、同じ結論に達しました: 従来の方法でプロパティを設定する方が良い. __get() + 大規模なスイッチはすべてを遅くします