どこでも、配列がどれだけ速いか、Active Recordがどれだけ遅いかを書いているだけです...しかし、特定の数値を見ると、他のものよりもどれだけ優れているかを理解するのがはるかに簡単です。
使用した材料:
-通常のラップトップ:Intel core 2 duo 2.13GHz、RAM 6 GB
-PHP 5.3
-Apache 2.2
- フレームワークYii 1.1.10
- アクティブレコード
テストの説明:
クラスがあります-
class Address extends CActiveRecord { … }
100万(1,000,000)回の繰り返しのサイクルがあります。 各反復で:
- 新しいオブジェクトが宣言され、データが入力されます。
$address = new Address();
- singltonパターンが使用されます。オブジェクトは、各反復で1回宣言され、オーバーフローします。
$address = Address::model();
- 配列が宣言され、入力されます。
$address = array();
- 単純なstdClass()。
$address = new stdClass();
- (オプション1のように)オブジェクトを宣言しますが、関連するすべてのARデータを初期化しません
$address = new Address(null);
結果(秒):
- 28.490615844727
- 7.2354989051819
- 4.5744869709015
- 5.9930000305176
- 9.5185680294037
結論:
- もちろん、配列だけでなくオブジェクトを使用してデータを保存および処理できます。
- もちろん、古典的なActive Recordのアプローチを使用しない場合でも、クラスはCActiveRecordから継承できます-このため、コンストラクターにnullを追加することを忘れないでください(
0ではなく空の文字列ではなく、注意してください):
$address = new Address(null);
書くことを避けます:
$address->attributes = $_POST['Address']
なぜなら 同時に、ARメタデータはとにかく接続され、オブジェクトの動作時間が増加します。
手動で割り当てを行う:
$address->street = $_POST['Address']['street'];
- もちろん、メソッドを使用する必要があります-model()-注意! これはYii <v.2に適用されます
- 配列だけで休まないでください-また、賢明に使用する必要があります。 便宜上、これらはオブジェクトとの比較には実質的になりません。
- 最も重要な結論は、製品開発の速度と製品の速度の間の「黄金の平均」を常に見つけなければならないということです。 たとえば、1日あたり少なくとも50,000回の訪問があり、サイト上のデータベースのデータのリストがない場合、一般的に配列を忘れて、ボトルネックが現れてブレーキがなくなるまで記憶しないことができます。
ActiveRecordから継承したクラスがこれほど多くの時間を費やす理由を知りたいです。 テストの結果、基本的にプロパティ/要素の初期化/割り当てに時間がかかることがわかります。 より多くのプロパティ/要素を使用する必要があるほど、オブジェクト/配列はより長く機能します。 また、 ActiveRecordはテーブルのすべてのフィールドを記述する必要があるため(このため、独自のdofigプロパティを持つクラスCActiveRecordMetaDataおよびCmysqlTableSchemaおよびCmysqlColumnSchemaがあります)、 ActiveRecordから継承されたクラスのメイン実行時間がメタデータのこの説明に費やされます。
これから、あなたは作ることができます
より多くの結論:
- ActiveRecordが生成するテーブルの列が多いほど、クラスが初期化される時間が長くなります。
- これは、SELECTに入れるフィールドの数に依存しないことに注意してください-いずれにしても、メタデータが発生します(もちろん、私が間違えない限り)。 それどころか、 DAOの速度はSELECT内のフィールドの数に直接依存します。
サンプルテストコード:
public function actionIndex() { $mk = microtime(true); for ($i = 0; $i < 1000000; $i++) { $this->test1(); } echo microtime(true) - $mk, '< br/ >'; … } public function test1(){ $address = new Address(); $address ->zip = 3423423; $address ->state_ id = 23332; $address ->house = 2234; $address ->street = 'asdfasdf'; $address ->street_type = 'asdfasdfasdfsdf'; $address ->address = 'asdfasdfsdf'; $address ->code = 's'; $address ->name = 'asdfasdfasf'; $address ->latitude = 23.23232; $address ->longitude = 23.342342; }
残りは類推によるものです。
PS
- このテストはphpのみに影響し、mysqlまたはapacheの最適化に決して依存しないことに注意してください。
- 一時的なテストデータは、理想的な条件下でのアレイまたはオブジェクトの理想的な動作時間ではないことを念頭に置く必要がありますが、相互の動作速度を比較できます。
PPS
Address()クラスが作成され、プロパティはおおよその意味で選択されます。