- PVSM.RU - https://www.pvsm.ru -
Сделал я недавно некий тест, который выдал любопытные данные. Коими хочу поделиться, дабы помочь многим прояснит спорные ситуации.
Везде только и пишут, что насколько быстры массивы, насколько медлителен Active Record… Но когда видишь конкретные цифры гораздо легче понимать что на сколько лучше другого.
— обычный ноутбук: Intel core 2 duo 2.13GHz, RAM 6 GB
— php 5.3
— apache 2.2
— framework Yii 1.1.10 [1]
— Active Record [2]
Существуюет класс —
class Address extends CActiveRecord { … }
Есть цикл из миллиона(1 000 000) итераций. На каждой итерации:
$address = new Address();
$address = Address::model();
$address = array();
$address = new stdClass();
$address = new Address(null);
$address = new Address(null);
и избегать записи:
$address->attributes = $_POST['Address']
т.к. при этом все равно происходит подключение мета данных AR и увеличиться время работы объекта.
Делаем присвоение в ручную:
$address->street = $_POST['Address']['street'];
Хочется узнать, почему же класс, наследуемый от ActiveRecord тратит так много времени. В результате тестов, мы видим, что в основном время затрачивается на инициализацию/присвоение свойств/элементов, т.е. чем больше приходится использовать свойств/элементов тем дольше будет работать объект/массив. А поскольку ActiveRecord должен описывать в себе все поля таблицы (для этого существует классы CActiveRecordMetaData [5] и CmysqlTableSchema [6] и CmysqlColumnSchema [7] у которых своих свойств дофига), то на это описание мета данных и тратиться основное время исполнения класса наследуемого от 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;
}
Остальное по аналогии.
Класс Address() выдуман и свойства выбраны приблизительно по смыслу.
Автор: AstRonin
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/php-2/10401
Ссылки в тексте:
[1] framework Yii 1.1.10: http://www.yiiframework.com/
[2] Active Record: http://yiiframework.ru/doc/guide/ru/database.ar
[3] CActiveRecord: http://www.yiiframework.com/doc/api/1.1/CActiveRecord
[4] мозги: http://www.braintools.ru
[5] CActiveRecordMetaData: http://www.yiiframework.com/doc/api/1.1/CActiveRecordMetaData
[6] CmysqlTableSchema: http://www.yiiframework.com/doc/api/1.1/CMysqlTableSchema
[7] CmysqlColumnSchema: http://www.yiiframework.com/doc/api/1.1/CMysqlColumnSchema
[8] DAO: http://yiiframework.ru/doc/guide/ru/database.dao
Нажмите здесь для печати.