6

私がやろうとしているのは、Web サイトのさまざまなポイントにまだロードされていないライブラリ(CI のライブラリ、カスタム ライブラリのいずれか) をロードすることです。ということで、これをチェックしたいと思います。

Loader ライブラリで検索を行ったところ、is_loaded() 関数が見つかったので、たとえば次のように実行できます。

if ($this->load->is_loaded('form_validation') === false) {
    $this->load->library('form_validation');            
}

これ(プロファイラーを有効にした場合)の奇妙な点は、メモリが増加することであり、これが正しい方法であるかどうか疑問に思います。

4

1 に答える 1

18

system/core/Loader.php の 914 行目あたりで、Codeigniter はライブラリがロードされているかどうかのチェックを実行し、再度ロードすることはありません。ただし、これらのチェックはメモリも消費します。ライブラリをロードするのに最適な方法を結論付けるために、ちょっとしたベンチマーク (試行ごとにメモリをクリーニングする) を行いました。結論は次のとおりです。

通常どおりライブラリをロードし$this->load...、Codeigniter に処理させるだけです。


基準:

$this->load->library('session');

Codeigniter セッション クラスを最初にロードした後、ライブラリをロードしたり、まだロードされていないかどうかをチェックしたりするさまざまな方法をテストしました。これらの各行は、20 倍ずつ個別に実行されました。


メモリ消費テスト (速度ではありません!)

if(!$this->load->is_loaded('session')) $this->load->library('session');

これは48.256 バイトを消費しました


if(!class_exists('ci_session')) $this->load->library('session');

これにより39.824 バイトが消費されました


if(!isset($this->session)) $this->load->library('session');

これにより31.904 バイトが消費されました


$this->load->library('session');

これは21.790 バイトを消費しました


もう一度テストを繰り返した後、結果は同じだったので、それは関係があるのか​​もしれません! 間違っていたらコメントください!


2014.07.08. Codeigniter 2.2.0 を使用した更新: テストは 1000 回の反復を使用して繰り返されました (以前のように 20 回ではありません)。結果は同じままです。メモリ消費は次のとおりでした: 2128b、1856b、1688b、1456b

@Tim Dev はコメントで、このベンチマークは最速のコードを示す必要はなく、メモリ消費量が最も少ないコードのみを示していると述べています。

于 2014-05-11T19:58:50.830 に答える