2011-02-16 6 views
0

これはまったく目立たないことは知っていますが、学習のためだけに、$ router-> controllerと$ router-> controllerの例で示すように、クラスメソッドを呼び出してクラスメソッドを呼び出すオーバーヘッドがあります。 >アクション?早すぎる最適化について、私はもっと勉強しようとしています。Classプロパティを呼び出すか、PHPのClassメソッドを呼び出すかのパフォーマンスですか?

// Using Class property 
$router = new Router($uri, $uri_route_map); 
$router->dispatch($router->controller, $router->action); 

// Using Class methods instead 
$router = new Router($uri, $uri_route_map); 
$router->dispatch($router->controller(), $router->action()); 

答えて

4

$router->controllerは、基本的にはちょうど変数を読み込み、クラスのプロパティをアクセスです。
$router->controller()であり、機能はである。関数を呼び出すことは、変数を読み込むよりもオーバーヘッドが大きくなります。特に、関数自体がおそらく変数を読み込むためです。

+2

注ルーター::コントローラではない場合というpublic、クラス外のプロパティにアクセスすると、 '__get( 'controller')'が存在する場合にはそれが呼び出されます。それがシーンの背後で文字列を操作して実際のプロパティを判断すると(Zend Frameworkで '_controller''に変換するのが一般的です)、それはさらに遅くなります。何が起こるかは、あなたがアクセスしているクラスに本当に依存します。 Router :: controllerは '__invoke()'を実装するオブジェクトでもあります。 –

3

あなたが学んでいるので、ラフな見積もりを取得するには、タイマースクリプトでそれを自分で試してみてください。

class MyClass 
{ 
    public $property1 = 'a'; 

    public function method1() 
    { 
     return $this->property1; 
    } 
} 

$mc = new MyClass(); 

$start = 0; $end = 0; 

// property 
$start = microtime(true); 
for ($a=0; $a<10000; $a++) { 
    $mc->property1; 
} 
$end = microtime(true); 
echo $end - $start . "<br />\n"; 

// method 
$start = microtime(true); 
for ($b=0; $b<10000; $b++) { 
    $mc->method1(); 
} 
$end = microtime(true); 
echo $end - $start . "<br />\n"; 

出力:
0.0040628910064697
0.0082359313964844

+0

例のおかげで、これは大きなアプリを設計するときに知っておくと良いでしょう – JasonDavis

関連する問題