ホームページ  >  記事  >  バックエンド開発  >  require_once のパフォーマンスは実際には非常に低い_PHP チュートリアル

require_once のパフォーマンスは実際には非常に低い_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:33:381003ブラウズ

テスト後、require_once はパフォーマンスが低い構文構造です。もちろん、このパフォーマンスの低さは、プロジェクトで現在使用されている require メソッドについて説明し、同時に実験コードを通じてその効率性を証明します。使用中に問題が発生しても、他の人が同じ問題に遭遇することを防ぐことができます。

  • require: ファイルをインポートし、実行時にコンパイルしてインポートします。
  • require_once: この関数は、このファイルが参照されるとコンパイルおよび導入されなくなる点を除いて、require と同等です。

上記が2つの違いです。 2 つの唯一の違いは、require_once が参照されているかどうかを判断するメカニズムを備えていることであることがわかります。インターネットで検索すると、require_once のパフォーマンスが require よりもはるかに低いというデータが数多く見つかります。この実験はここでは行いません。

私たちのプロジェクトのアプローチは次のとおりです: 必要な場合は、isset($xxxxxx) または require 'xxxxx.php' を使用して、各ファイルの先頭でグローバル変数を定義します。

このアプローチの欠点は何ですか?

$xxx にグローバル変数が定義されている場合、そのファイルが関数内で必要な場合、その変数はグローバルではなく関数のローカル変数として解析されます。そのため、関数内で isset($xxx) または require 'xxx を実行します。文法構造 .php' は無効になり、クラスの再定義、メソッドの再定義など、予期せぬ結果が確実に発生します。

過去の教訓から、グローバル変数を定義するには、 $GLOBALS['xxx'] を使用してください。直接定義すると少し遅くなりますが、間違っているよりははるかに優れています。

以前のグローバル変数は直接定義されていたため、今日同僚と議論しているときに、別の書き方を考えました:

定義された場所は引き続き $xxx メソッドを使用して直接定義され、require メソッドで変更されます (ファイル ヘッダーで定義されたグローバル変数はファイル名に関連付けられます)。

リーリー

この方法は動的変数を使用します。直接 GLOBALS 方法と比較すると、次の 2 つの重大な欠点があります。

動的変数の導入により、パフォーマンスは GLOBALS メソッドより約 2 倍遅くなります。
  1. 間接参照の問題は、間接参照されるファイルの名前を予測できないため解決できません。したがって、間接参照されるファイル内で定義されているマーク付きグローバル変数を宣言するために global を使用することはできません。
  2. さて、これが GLOBALS メソッドの require と require_once のテストです:

require_requirionce.php

リーリー

require_requirionce_require.php (requireのテストに使用する導入ファイル)

リーリー

require_requirionce_requirionce.php (require_onceのテストに使用される導入ファイル)

リーリー

テスト結果は以下の通りです(単位:秒):

メソッドを使用せずにメソッドを設定または要求する: 0.22953701019287
  • isset または require メソッドを使用します: 0.23866105079651
  • require_once メソッド: 2.3119640350342
  • メソッドを使用しない場合の require 速度は、メソッドを使用する場合よりもわずかに高速であることがわかります。どちらも、require_once の速度の約 10 倍です。

それでは、パフォーマンスの低下は正確にどこで発生するのでしょうか?

上記の require_requireone.php ファイルの test1 メソッドで、 pathinfo($filename) とコメントしました。これは、私の当初の意図は、マークされたグローバル変数名としてサフィックスのないファイル名を使用することであったためですが、 pathinfo を使用すると、このメソッドのパフォーマンス消費は基本的に require_once と同じです。そこで、pathinfo への別の呼び出しを追加してテストを行いました。確かに、pathinfo が問題を引き起こしていました。そこで、後で現在のバージョンに修正し、ファイル名を直接変数名として使用しました。ファイル名が重複するのが怖い場合は、パス名を追加することもできます...

推測: pathinfo を追加した後、require と require_once のパフォーマンス消費は基本的に同じなので、PHP の require_once の内部処理はそれに基づいていると推測できますか? PHP5.3 では require_once が大幅に最適化されたと言われていますが、私はテスト中に PHP5.3.5 バージョンを使用しましたが、以前のバージョンよりも大幅に最適化されているだけでしょうか。これはまだテストされていません....

test1 メソッドを次のように変更してみてください: isset($GLOBALS[substr($filename, 0, strlen($filename) - 4)]) または require $filename;

手動の文字列インターセプトを使用します。もちろん、インターセプトには時間がかかりますが、pathinfo バージョンよりも優れています。今回の検証結果は以下の通りです

メソッドを使用せずにメソッドを設定または要求する: 0.21035599708557
  • isset または require メソッドを使用します: 0.92985796928406
  • require_once メソッド: 2.3799331188202
  • require_once を isset または require モードに変更する場合は、次の点に注意する必要があります:

各ファイルヘッダーは、$GLOBALS['XXX'] = 1; を使用して定義された一意のマーカー変数を定義し、変数名はファイル名またはパスを含むファイル名にすることをお勧めします (別のファイル名が繰り返される場合) )
  1. カスタム require メソッドを定義します:
  2. リーリー
  3. www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/752440.html技術記事テスト後、require_once はパフォーマンスが低い構文構造です。もちろん、このパフォーマンスの低さは、現在プロジェクトで使用されている require メソッドについて説明します。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。