TL; DR
を実行する方が速いですかfile_exists
、またはからの戻り値をチェックする@include
(つまりエラーを抑制する)方が速いですか?
このコンテキストでは、私が絶対パスを使用していて、include_path
解決に依存していないと想定する場合があります。
手の込んだバージョン
フレームワークやソフトウェアがブートストラッププロセスに持つすべての条件付きコードを使用して、優雅さを犠牲にすることなく失敗する最速の方法について考え始めました。この考えが頭に浮かんだ特定のユースケースがあります。つまり、必ずしも存在しない構成ファイルを含めることです。
どちらの操作も統計を実行するため、ディスクアクセスを回避する方法はありません。後者のオプションには、成功したときにファイルを読み取って解析するという追加の利点があるため、私の考えでは、それはすでにかなり大きなボーナスです。
これは本当に極端なマイクロ最適化です。特に、ファイルが1つしかない場合はそうですが、それでも質問に悩まされ、自分でこれを適切にテストする方法がわかりません。
受け入れ後のブルートフォーステスト
適切な回答を得た後、ブルートフォーステストを行いました。現場からの情報に基づいた回答が欲しかったので、以前はこれをやりたくありませんでした。また、これがブルートフォーステストだけに基づくことはしたくありませんでした。これがこれをテストする適切な方法であるかどうかはまったくわかりません。(実際、そうではないと確信しています。)
私がしたことは、次のコードスニペットを実行することでした。
<?php
$rounds = 1e6;
$start = microtime(true);
while ($rounds--) {
@include "i-dont-exist";
clearstatcache();
}
echo microtime(true) - $start, PHP_EOL;
...と...
<?php
$rounds = 1e6;
$start = microtime(true);
while ($rounds--) {
file_exists("i-dont-exist");
clearstatcache();
}
echo microtime(true) - $start, PHP_EOL;
...と...
<?php
$rounds = 1e6;
$start = microtime(true);
while ($rounds--) {
@include "i-exist";
clearstatcache();
}
echo microtime(true) - $start, PHP_EOL;
...と...
<?php
$rounds = 1e6;
$start = microtime(true);
while ($rounds--) {
if (file_exists("i-exist")) @include "i-exist";
clearstatcache();
}
echo microtime(true) - $start, PHP_EOL;
結果は次のとおりです。
存在しないファイル
@include
:27.090675830841
file_exists
:1.0596489906311
既存のファイル
@include
:19.758506059647
file_exists + include
:22.083800077438
これから何を結論付けることができますか?まあ、少なくとも、@ goldencraterによる回答で提供されているリンクによると、エラーの抑制にはコストがかかります。
一般に、エラーの抑制もばかげていると思います。情報に基づいた選択でない限り、私のユースケースで検証できる基準です。
インクルードファイルが失敗した後に失敗する場合、失敗のコストは失敗したリクエストでのみ推測されるため、インクルードからのエラーを抑制することは正当であると私は考えています。(つまり、エラーは抑制および無視されません。)失敗した要求に高額のコストをかけることは、すべての要求に少額のコストをかけるよりもはるかに悪いことではありません。