Active Recordのモデルといくつかの配列の使用の最適化

最近、興味深いデータを生成するテストを行いました。 多くの物議を醸す状況を明確にするために、誰と共有したいのか。
どこでも、配列がどれだけ速いか、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)回の繰り返しのサイクルがあります。 各反復で:
  1. 新しいオブジェクトが宣言され、データが入力されます。
     $address = new Address(); 

  2. singltonパターンが使用されます。オブジェクトは、各反復で1回宣言され、オーバーフローします。
     $address = Address::model(); 

  3. 配列が宣言され、入力されます。
     $address = array(); 

  4. 単純なstdClass()。
     $address = new stdClass(); 

  5. (オプション1のように)オブジェクトを宣言しますが、関連するすべてのARデータを初期化しません
     $address = new Address(null); 



結果(秒):


  1. 28.490615844727
  2. 7.2354989051819
  3. 4.5744869709015
  4. 5.9930000305176
  5. 9.5185680294037


結論:




ActiveRecordから継承したクラスがこれほど多くの時間を費やす理由を知りたいです。 テストの結果、基本的にプロパティ/要素の初期化/割り当てに時間がかかることがわかります。 より多くのプロパティ/要素を使用する必要があるほど、オブジェクト/配列はより長く機能します。 また、 ActiveRecordはテーブルのすべてのフィールドを記述する必要があるため(このため、独自のdofigプロパティを持つクラスCActiveRecordMetaDataおよびCmysqlTableSchemaおよびCmysqlColumnSchemaがあります)、 ActiveRecordから継承されたクラスのメイン実行時間がメタデータのこの説明に費やされます。
これから、あなたは作ることができます

より多くの結論:




サンプルテストコード:



 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


  1. このテストはphpのみに影響し、mysqlまたはapacheの最適化に決して依存しないことに注意してください。
  2. 一時的なテストデータは、理想的な条件下でのアレイまたはオブジェクトの理想的な動作時間ではないことを念頭に置く必要がありますが、相互の動作速度を比較できます。


PPS


Address()クラスが作成され、プロパティはおおよその意味で選択されます。

Source: https://habr.com/ru/post/J146707/


All Articles