CIフレームワークのソースコード閲覧メモ5 ベンチマークテスト BenchMark.php

WBOY
リリース: 2016-06-21 08:47:21
オリジナル
1087 人が閲覧しました

BenchMark は CI にロードされる最初のコア コンポーネントであるため、分析は最初にこのコンポーネントから開始されます。 BenchMark ツールを使用したことのある学生は、これがベンチマーク コンポーネントであることを知っているはずです。 BenchMark であるため、BM コンポーネントの主な機能はプログラムの実行時間、メモリ使用量、CPU 使用量などを記録することであると大胆に推測できます。

このコンポーネントの構造は比較的単純で、マーカー内部変数が 1 つと外部インターフェイスが 3 つだけあります。

1 経過時間

2 マーク

3 メモリ使用量

1 つずつ展開してみましょう:

1.マーク

関数の署名は次のとおりです:

関数マーク($name)

この関数は文字列型パラメータを受け入れ、実装は 1 つの文だけで簡単になります:

$this->マーカー[$name] = microtime();

言い換えれば、この関数は、関数が呼び出された時点を記録するためにのみ使用されます。

コントローラーの特殊な処理 (後で詳しく説明します) により、$this->benchmark->mark($name); を使用してアプリケーションに追加できることに注意してください。コントローラ。たとえば、

の実行時点。

$this->benchmark->mark("function_test_start");

$this->_test();

$this->benchmark->mark("function_test_end");

print_r($this->ベンチマーク);

このうち、function_test_start と function_test_end は、それぞれ関数呼び出しの開始時点と終了時点を記録するために使用されます

印刷結果:

関数の呼び出し時間を計算するには、BenchMark コンポーネントの 2 番目の関数 elapsed_time を使用する必要があります

2. 経過時間

関数の署名は次のとおりです:

関数 elapsed_time($point1 = '', $point2 = '', $小数 = 4)

3 つのパラメータはすべてオプションです

(1) $point1 が空の場合、「{elapsed_time}」を返します

if ($point1 == '') {

'{elapsed_time}' を返します;

}

ナニ!明らかに時間を返すはずですが、代わりに文字列を返します。これは非常に奇妙です (smarty タグに似ています)。実際、Output コンポーネントでは、{elapsed_time} が置き換えられます。ここでは、置き換えメソッドを見てみましょう:

$elapsed = $BM->elapsed_time('total_execution_time_start', 'total_execution_time_end');

$output = str_replace('{elapsed_time}', $elapsed, $output);

つまり、パラメータが指定されていない場合、この関数を呼び出して実際に取得されるのは、total_execution_time_start時点からtotal_execution_time_end時点までの時間差です。さらに、total_execution_time_start は BM がロードされた後に設定される最初のマーク ポイントであるため (total_execution_time_end は定義されておらず、現在の時点を返します)、この関数が実際に返すのはシステムのロード時間と実行時間です。

(2) 不明なマークポイントが呼び出された場合。結果は不明で、空が直接返されます:

if ( ! isset($this->marker[$point1]))

{

'';

を返す

}

(3). $point2 のマークポイントが設定されていない場合は、$point2 のマークポイントを現在の時点に設定します。

if ( ! isset($this->marker[$point2]))

{

$this->marker[$point2] = microtime();

}

(4) 返された最後の 2 つのマーク ポイント間の時間差:

list($sm, $ss) =explode(' ', $this->marker[$point1]);

list($em, $es) =explode(' ', $this->marker[$point2]);

returnnumber_format(($em + $es) - ($sm + $ss), $Decimals);

前の例を見ると、ここで次のように呼び出すことができます:

echo $this->benchmark->elapsed_time("function_test_start","function_test_end");

関数の実行時間を取得します。

3. メモリ使用量

この関数はシステムのメモリ使用量 (MB 単位) を返します。{elapsed_time} と同様に、この関数によって返される {memory_usage} も出力:

で置き換えられます。

$memory = ( ! function_exists('memory_get_usage')) ? '0' :round(memory_get_usage()/1024/1024, 2).'MB';

$output = str_replace('{memory_usage}', $memory, $output);

BenchMark コンポーネント自体は比較的単純なので、これ以上の説明は省略します。

最後に、このコンポーネントのソース コードを貼り付けます:

コードをコピー

クラス CI_Benchmark {

/**

* すべてのベンチマーク マーカーと追加時期のリスト

*

* @var array

     */

var $marker = array();

/**

* ベンチマークマーカーを設定します

*

* @access public

* @param string $name マーカーの名前

* @return void

     */

関数マーク($name)

{

$this->marker[$name] = microtime();

}

/**

* マークされた 2 つのポイント間の時間差を計算します。

* 最初のパラメータが空の場合、この関数は代わりに {elapsed_time} 擬似変数を返します。これにより、システム全体が許可されます

* @access public

* @param string 特定のマークされたポイント

* @param string 特定のマークされたポイント

* @param integer 小数点以下の桁数

* @return mixed

     */

function elapsed_time($point1 = '', $point2 = '', $Decimals = 4)

{

if ($point1 == '')

{

return '{elapsed_time}';

}

if ( ! isset($this->marker[$point1]))

{

return '';

}

if ( ! isset($this->marker[$point2]))

{

$this->marker[$point2] = microtime();

}

list($sm, $ss) =explode(' ', $this->marker[$point1]);

list($em, $es) =explode(' ', $this->marker[$point2]);

returnnumber_format(($em + $es) - ($sm + $ss), $Decimals);

}

/**

* メモリ使用量

* この関数は、{memory_usage} 疑似変数を返します。

     */

関数memory_usage()

{

return '{memory_usage}';

}

}



関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート