ホームページ >バックエンド開発 >PHPチュートリアル >php_PHP チュートリアルの inlcude() パフォーマンス比較の詳細な説明
PHP プログラマーが最もよく使用する 2 つの関数は、require_once と include です。これらの 2 つの関数を通じて、他のクラス ライブラリで定義されたクラスなどのオブジェクトを使用できます。しかし、多くの人は、同じディレクトリ内の他のファイルをインクルードするときに、単に次のコードを使用してファイルを参照します:
パフォーマンスを含める
コードは次のとおりです | コードをコピー |
include('include.php'); |
もちろん、この方法に問題はありませんが、次の方法よりも効率がわずかに劣ります:
コードは次のとおりです | コードをコピー |
include(realpath(dirname(_FILE_)).DIRECTORY_SEPARATOR.'include.php'); |
この方法ではさらに多くの入力が必要になる場合がありますが、PHP エンジンが include_path を反復処理して「include.php」という名前のすべての名前を検索して、対応するオブジェクト、dirname(__FILE__) の絶対パスを見つける必要がある前の方法と比較すると、を指定すると、システムは対応するファイルを迅速に見つけることができます。
PHP の定数 __FILE__ は、実際には C# の AppDomain.CurrentDomain.BaseDirectory に非常に似ており、現在実行されているコードが配置されているファイルの絶対パスを返します。関数 dirname() は、その親フォルダーのパスを返します。
より効率的で簡単に作成できるもう 1 つの方法は include('./include.php') です。これは、現在のパスで 'include.php' ファイルを見つけるようにシステムに指示するのと同じです。
大規模なシステムでは、別のより良い方法を使用して、ルーティング ファイルやその他の初期化ファイルに次のコードを追加することがよくあります。
コードをコピー | |
define('APP_PATH',realpath(dirname(_FILE_)));
|
コードをコピー | |
|
オートロードとインクルードのパフォーマンス比較
たとえば、次の 4 つのスクリプトがあります:
コードをコピー | |||||||||
//@todo something#file:include2.php //@todo something#file:script1.php include 'include2.php'; //@何かをする #ファイル:script2.php include 'include1.php'; 「script1.php」をインクルードします //@何かすること |
代码如下 | 复制代码 |
#file:SimpleClass.php #file:php_include.php |
当$loop值为1时,脚本耗时约0.00018906593322754秒,当$loop为1000时,脚本耗时约0.076701879501343秒。
如果我们用autoload实现呢?
代码如下 | 复制代码 |
#file:php_autoload.php |
在这段代码中,我定义了__autoload函数,几乎一样的脚本,当$loop为1时,耗时0.0002131462097168秒,而当$loop为1000时,耗时仅为前面代码的1/7,0.012391805648804秒。
但请注意看SimpleClass的代码,其中输出了一行字符串,如果去掉这行输出后再比较,会是什么样的结果呢?
在$loop同为1000的情况下,前者耗时0.057836055755615秒,而使用了autoload后,仅仅0.00199294090271秒!效率相差近30倍!
从上面的测试可以看出,当文件仅仅被include一次,autoload会消耗稍微多一点的时间,但如果在文件被反复include的情况下,使用autoload则能大大提高系统性能。
至于是否要使用autoload来解放程序员,这就仁者见仁,智者见智了。在我看来,条件允许的前提下,牺牲这一点性能(某些情况下,甚至可能是提升性能)更为便捷的开发,是值得的。
include()和require()性能
对include()来说,在 include()执行时文件每次都要进行读取和评估;
而对于require()来说,文件只处理一次(实际上,文件内容替换了require()语句)。
这就意味着如果有包含这些指令之一的代码和可能执行多次的代码,则使用require()效率比较高。
另一方面,如果每次执行代码时相读取不同的文件,或者有通过一组文件叠代的循环,就使用include(),
因为可以给想要包括的文件名设置一个变量,当参数为include()时使用这个变量。