ホームページ >バックエンド開発 >PHPチュートリアル >PHPコード最適化メンバ変数取得速度比較_PHPチュートリアル

PHPコード最適化メンバ変数取得速度比較_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:36:55854ブラウズ

以下に 4 つのコード例がありますが、オブジェクトの作成とメンバー変数の取得はどの順番で行われると思いますか?

1: メンバー変数を public に設定し、代入操作でメンバー変数に値を代入し、変数を直接取得します

コードをコピー コードは次のとおりです:

class Foo {
public $id;
}
$data = new Foo;
$data->id = 10;
echo $data->id;
?>

2: メンバー変数を次のように設定します。 public にして、コンストラクターを通じてメンバー変数の値を設定し、変数を直接取得します
コードをコピーします コードは次のとおりです:

class Foo2 {
public $id;
public function __construct($id) {
$this->id = $id ;
}
}

$data = new Foo2(10);
echo $data->id;
?>


3: メンバー変数を protected に設定し、コンストラクターを通じてメンバー変数の値を設定し、変数を取得しますマジックメソッドを使用して
コードをコピーします コードは次のとおりです:

class Foo3 {
protected $id;
public function __construct($id) {
$this-> id = $id;
}

public function getId() {
return $this->id;
}
}
$data = new Foo3(10);
echo $data->getId();
?>


4:メンバー変数を protected に設定し、コンストラクターを通じてメンバー変数の値を設定し、メンバー メソッドを通じて変数を取得します
class Foo4 {
protected $id;
public function __construct($id) {
$this-> id = $id;
}

public function __get($key) {
return $this->id;
}
}
$data = new Foo4(10);
echo $data->id;
?>
実行によると速度ソート: 1243
まずオペコードを見てみましょう:
1:

コードをコピーします コードは次のとおりです:

1 ZEND_FETCH_CLASS 4 :4 'Foo'
2 NEW $5 :4
3 DO_FCALL_ BY_NAME 0
4 ASSIGN !0 , $5
5 ZEND_ASSIGN_OBJ !0, 'id'
6 ZEND_OP_DATA 10
7 FETCH_OBJ_R $9 !0, 'id'
8 ECHO ! $9

2:
コピーコード コードは次のとおりです:

1 ZEND_FETCH_CLASS 4 :10 'Foo2'
2 NEW $14 !1, 'id'
7 ECHO $ 14


3:


コードをコピーします
コードは次のとおりです以下: 1 ZEND_FETCH_CLASS 4:15 'Foo3'2 NEW
5 ASSIGN !2, $16
6 ZEND_INIT_METHOD_CALL !2, 'getId'
7 DO_FCALL_BY_NAME 0 $20
8 ECHO $20


4:



コードをコピーします

コードは次のとおりです:

1 ZEND_FETCH_CLASS 4 :21 'Foo4'
2 NEW :21
3 END_VAL 10
4 DO_FCALL_BY_NAME 1
5 ASSIGN !3, $22
6 FETCH_OBJ_R !3, 'id'
7 ECHO $25


に基づく上記のオペコードについては、zend_vm_execute.h ファイル内の対応するオペコード実装を参照してください。

1. PHP カーネルでオブジェクトを作成するプロセスは 3 つのステップに分かれています:

ZEND_FETCH_CLASS は、クラス名に従ってストレージ クラスの変数を取得し、ハッシュタルブ EG(class_table) の検索操作として実装されます。 NEW オブジェクトを初期化し、EX(call)->fbc がコンストラクター ポインターを指します。
コンストラクターを呼び出します。呼び出しは他の関数呼び出しと同じで、すべて zend_do_fcall_common_helper_SPEC を呼び出します

2. マジック メソッドの呼び出しは、直接呼び出しではなく、条件によってトリガーされます (メンバー変数 ID の取得など)。例

(zend_std_read_property) の手順は次のとおりです:
オブジェクトのプロパティを取得し、存在する場合は 2 番目のステップに進み、関連する属性がない場合は 3 番目のステップに進みます
に対応するプロパティがあるかどうかを確認しますオブジェクトのプロパティから名前を取得し、存在する場合は結果を返し、存在しない場合は 3 番目のステップに進みます
__get マジック メソッドがある場合は、このメソッドを呼び出して変数を取得します。存在する場合、エラーが報告されます
並べ替えの問題に戻ります:

1. 最初と 2 番目の違いは何ですか?

2 番目のオペコードは最初のオペコードよりも少ないですが、コンストラクターのパラメーターが多く、パラメーター処理用のオペコードが 1 つ多いため、最初のオペコードよりも遅くなります。パラメーターの処理は比較的時間のかかる操作です。コードの最適化を行う場合、関数に複数のパラメーターがある場合は、それらを配列にカプセル化して渡すことを検討できます。

2. 3 番目が最も遅いのはなぜですか?

パラメータの取得は本質的にオブジェクトのメンバーメソッドの呼び出しであるため、メソッドを呼び出すコストは変数を取得するよりも高くなります

3 なぜ 4 番目の方が 3 番目よりも速いのでしょうか?

4番目の操作は実際に変数を取得するのですが、内部でマジックメソッドの呼び出しを実装しているため、ユーザー定義メソッドに比べて内部関数の呼び出し効率が高くなります。したがって、呼び出し可能なメソッドが PHP カーネルによって実装されている場合は、車輪の再発明をすべきではありません。
4. 4 番目の方が 2 番目よりも遅いのはなぜですか?
PHP オブジェクトが変数を取得するプロセスで、メンバー変数がクラスの定義に含まれなくなると、PHP 独自のマジック メソッド __get が呼び出され、マジック メソッドの呼び出しが 1 つ追加されます。

要約すると:

1. PHP 組み込み関数を使用する
2. オブジェクト指向 (OOP) である必要はなく、各メソッドとオブジェクトの呼び出しは多くの時間を消費します。メモリ。
3. マジック メソッドの使用は最小限に抑えます。フレームワークには多数のマジック メソッドが含まれているため、必要な場合を除き、フレームワークを使用しないでください。
4. パフォーマンス優先のアプリケーション シナリオでは、OOP を使用する必要がある場合、メンバー変数がより良い方法です。
5. PHP 構文構造を使用できる場合は、関数を使用しないでください。関数を使用できる場合は、オブジェクトを使用しないでください。

http://www.bkjia.com/PHPjc/736832.html

tru​​ehttp://www.bkjia.com/PHPjc/736832.html技術記事以下に 4 つのコード例があります。オブジェクトの作成とメンバー変数の取得はどの順番で速度が速いと思いますか? 1:メンバー変数をpublicに設定し、メンバー変数に値を代入します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。