xPDO vs pdoFetch
Решил затестить чистый xPDO на скорость и противопоставить ему pdoFetch.
Ничего не имею против первого или второго. Напротив. Второе использую в работе регулярно. Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?
P.S.: Тестировалось на ахеренно быстром хостинге для MODX REVO — modhost.pro.
Ничего не имею против первого или второго. Напротив. Второе использую в работе регулярно. Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?
P.S.: Тестировалось на ахеренно быстром хостинге для MODX REVO — modhost.pro.
pdoFetch:
<?
$pdoFetch = $modx->getService('pdoFetch');
$setConfigArray = array(
'return' => 'data',
'parent' => '0',
'limit' => '2000',
'select' => 'id,pagetitle,uri,content',
);
$pdoFetch->setConfig($setConfigArray);
$resources = $pdoFetch->run();
for($i=0; $i<count($resources); $i++)
{
print $resources[$i]['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
Результаты:
1ый запуск:
0.0118151: Total time
12 058 624: Memory usage
2ой запуск:
0.0111890: Total time
12 058 624: Memory usage
xPDO:
<?
$pdo = $modx->getService('pdoTools');
$q = $modx->newQuery('modResource');
$q->select( array("id","uri","pagetitle","content") );
$q->limit(2000);
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(PDO::FETCH_ASSOC)) {
print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
Результаты:
1ый запуск:
0.0021060: Total time
3 932 160: Memory usage
2ой запуск:
0.0016491: Total time
4 194 304: Memory usage
Комментарии: 28
А вопрос — откуда разница такая берется, так? Из метода $pdoFetch->run(), который кроме запроса в базу выполняет еще различные операции. Опять же в первом случае метод вернул массив, по которому прошлись для вывода pagetitle, во втором случае данные сразу отправляются из результата запроса на вывод. Тут уже сами решайте, какой способ для вашей задачи по выводу pagetitle лучше.
P.S. Второй способ у вас — PDO, а не xPDO.
P.S. Второй способ у вас — PDO, а не xPDO.
Как-то не совсем я корректно ответил. Во втором случае от xPDO только формирование запроса, не хватает getCollection.
Ну и fetch(PDO::FETCH_ASSOC) лучше было бы заменить на fetchAll, а потом пройтись по массиву, как в первом случае. Так условия для сравнения были бы ровнее (:
Ну и fetch(PDO::FETCH_ASSOC) лучше было бы заменить на fetchAll, а потом пройтись по массиву, как в первом случае. Так условия для сравнения были бы ровнее (:
P.S. Второй способ у вас — PDO, а не xPDO.
Как-то не совсем я корректно ответил. Во втором случае от xPDO только формирование запроса, не хватает getCollection.Вообще-то самый что ни на есть xPDO.
$q = $modx->newQuery('modResource');
— создается объект запроса xPDOQuery, который, как понятно из названия, имеет непосредственное отношение к xPDO. $s = $q->prepare();
Возвращает PDO-объект PDOStatement. Открою вам тайну: pdoTools, использующие в своей работе xPDO, так же в итоге приходят к этому объекту для выполнения запросов к БД, без этого просто никак.$s->execute();
Выполнение непосредственно запроса к БД. Так что здесь не только формирование запроса, но и выполнение его и обработка полученных данных.А getCollection() — это не только все выше перечисленное, но еще и набивка данных в конечные xPDO-объекты. А это уже совсем другая задача. Ну и следует отметить, что в первом случае getCollection() тоже не выполняется, а просто так же выполняется запрос к БД и возвращаются полученные данные. getCollection() выполняется у pdoFetch в совсем другом методе.
Ну и fetch(PDO::FETCH_ASSOC) лучше было бы заменить на fetchAll, а потом пройтись по массиву, как в первом случае. Так условия для сравнения были бы ровнее (:Да, в этом тоже отличие этих двух примеров. В первом случае идет выборка сразу всех записей и возвращается конечный массив данных, а во втором случае идет построчный перебор полученного результата. Но, во-первых, это влияет на количество потребляемой памяти (что мы и видим наглядно), но на время выполнения почти не влияет. Что в одном случае, что в другом идет перебор 2000 результирующих записей. А во-вторых, здесь не должно быть цели приравнять результаты обоих вариантов к общему знаменателю. Здесь есть желание увидеть есть ли разница или нет. А разница безусловно будет. Объясню просто. Вот цепочка выполнения первого примера:
pdoTools -> xPDO -> PDO.
А вот цепочка второго примера:
xPDO -> PDO.
Найдите 10 отличий. Как ни крути, pdoTools не может быстрее работать, чем чистый xPDO, без которого сам pdoTools работать не может. Он может кому-то быть удобней в использовании, но не быстрее, потому что к выполнению первого варианта еще плюсуйте кучу методов отсюда, а второй вариант — конечный.
Именно по причине того, что многие не понимают до конца принципов работы xPDO, они и используют активно pdoTools искренне считая, что это самый быстрый и удобный способ взаимодействия с БД. Ну что? Василию надо отдать должное, он смог пропиарить свои наработки на базе массовой некомпетентности MODX-разработчиков. Ну, это уже каждому свое, и свое не каждому. Раз оно популярно, значит помогает в разработках. Но факт останется фактом — pdoTools никогда не будет работать быстрее и более гибко, чем чистый xPDO. Это можно даже тесты не проводить.
Как ни крути, pdoTools не может быстрее работать, чем чистый xPDO, без которого сам pdoTools работать не может. Он может кому-то быть удобней в использовании, но не быстрее, потому что к выполнению первого варианта еще плюсуйте кучу методов отсюда, а второй вариант — конечный.Это я и хотел сказать, но за разъяснение нюансов все равно спасибо.
Но факт останется фактом — pdoTools никогда не будет работать быстрее и более гибко, чем чистый xPDO. Это можно даже тесты не проводить.pdoTools это же просто библиотеки для разработки компонентов, что тут тестировать-то. Их или используют, кому это удобно, или не используют для разработки своих компонентов. Я не использую, ты тоже не используешь — ни хуже, ни лучше они от этого не становятся. А если кто-то пишет вместо слова getResources слово pdoResources и радуется разнице, то что в этом плохого? Ты же не думаешь, что количество скачиваний pdoTools означает, что столько людей используют их для разработки?
На счет кол-ва использований вообще не спорю. Его много кто использует в том числе и за рубежом. Пруфф. Но топик касался сравнения скорости и ваши комментарии немного некорректными были, поэтому я и расставил точки над i. Если бы топик был о том кому что больше нравится, я бы не сунулся сюда.
Там названия пакетов, а используют сниппеты из комплекта, мне кажется, а не сами библиотеки непосредственно.
Опять 25. Все понимают, что pdoTools не может быть быстрее чистого xPDO. Но он быстрее базовых wayfinder'ов, getResources и т.п. Да и удобно иметь все в одном. Кроме того, Василий никого под страхом смерти не заставляет его использовать.
Николай, вы наверно пользуетесь jQuery. Почему бы Вам не написать разработчикам и обозвать всех пользователей данной библиотеке некомпетентными, ведь чистый javascript быстрее. Ну раз уж у Вас столько свободного времени.
П.С. Ваши профессиональные советы и подсказки помогают многим и начинающим и опытным. Но читая данные посты складывается мнение, что это 2 разных человека. Детский сад, чесслово.
Николай, вы наверно пользуетесь jQuery. Почему бы Вам не написать разработчикам и обозвать всех пользователей данной библиотеке некомпетентными, ведь чистый javascript быстрее. Ну раз уж у Вас столько свободного времени.
П.С. Ваши профессиональные советы и подсказки помогают многим и начинающим и опытным. Но читая данные посты складывается мнение, что это 2 разных человека. Детский сад, чесслово.
Эээ, чтобы вы понимали, топикстартер — не я :)
А коммент мой был ответом на другой коммент, не совсем корректный в техническом плане.
По поводу компетенций: сама модель MODX-а изначально ориентирована на не разработчиков. Это не секрет. И я уверен, что большинство MODX-разработчиков, как и в первом комментарии, не совсем отличит PDO от xPDO и т.п. Поэтому я и говорю про компетенции. Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.
А коммент мой был ответом на другой коммент, не совсем корректный в техническом плане.
По поводу компетенций: сама модель MODX-а изначально ориентирована на не разработчиков. Это не секрет. И я уверен, что большинство MODX-разработчиков, как и в первом комментарии, не совсем отличит PDO от xPDO и т.п. Поэтому я и говорю про компетенции. Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.
А коммент мой был ответом на другой коммент, не совсем корректный в техническом планеА Ваш некорректен в этическом плане. Оскорбление других не является показателем профессионализма.
Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.Если разбирать Ваши статьи про Ваши же компоненты (ShopModxBox, modxSmarty и др.) по Вашим же критериям оценки подачи материала, то кроме пиара в них ничего нет — описываете практически те же достоинства — быстрые, удобные и т.п. Что естественно для специалиста — добиваться качественных результатов. Но к себе Вы не столько критичны. :)
В очередной раз поддерживаю предложение не плевать друг на друга, а направить свои усилия на развитие MODX. От этого больше пользы.
Но к себе Вы не столько критичны. :)Я очень к себе критичен. Потому и заставляю себя постоянно развиваться. Попробуйте вы разобрать мои наработки по гаечкам и уличить меня в некомпетентности.
В очередной раз поддерживаю предложение не плевать друг на друга, а направить свои усилия на развитие MODX. От этого больше пользы.А вы меньше смотрите на мою бестактность и больше читайте суть техническую. Я программист, а не политик. Особо слова не выбираю. Но попробуйте сказать что техническое возражение мое на комментарий было не корректным. Где я там допустил ошибку и в чем? Меньше обращайте внимание на мой тон и больше на техническую составляющую, и вот вам больше пользы.
Я программист, а не политик.Ну тогда может не стоит и мучатся. Кидаться какашками — это уровень сами знаете кого. А мы все-таки доросли до Сапиенс. :)
Попробуйте вы разобрать мои наработки по гаечкам и уличить меня в некомпетентности.Николай, оно мне надо? Даже если бы у меня был Ваш уровень знаний, я бы не стал этого делать. У меня другие принципы. Я лучше потрачу это время на что-то хорошее.
Меньше обращайте внимание на мой тон и больше на техническую составляющую, и вот вам больше пользы.Что и делаю. Пользуюсь и Вашими наработками и Василия. За что благодарен вам обоим. И многие благодарны. Но скатывание до базарных разборок печалит. Ну вот Пашок пришел сам к чистому xPDO после pdoTools. Процесс идет. Кому надо научатся.
Принцип Василия по разработке сайтов мне кажется логичным. Скачал необходимые пакеты и небольшими усилиями сделал сайт. А уж если есть претензии к скорости, то на последнем этапе оптимизировать узкие места. А придираться можно бесконечно.
Ну вот Пашок пришел сам к чистому xPDO после pdoTools. Процесс идет. Кому надо научатся.Полностью согласен. Должен быть какой-то трамплин для тех,
Принцип Василия по разработке сайтов мне кажется логичным. Скачал необходимые пакеты и небольшими усилиями сделал сайт. А уж если есть претензии к скорости, то на последнем этапе оптимизировать узкие места. А придираться можно бесконечно.
Конечно, pdoTools не может работать быстрее, чем сам PDO, но сравнение твоё совсем не корректно.
Если уж ты используешь минимум фукнций xPDO, то давай сравним вот так:
А теперь твой xPDO пример, в котором добавлен вызов getSelectColumns, чтобы было по-честному:
И внезапно, скорость и потребление памяти практически идентичны! Циферки больше, потому что проверял на сервере h1, а не h3.
Никто не заставляет тебя использовать все методы pdoFetch, можно выбирать только нужные.
Если уж на то пошло, то вот абсолютный лидер по всем параметрам, включая количество строк:
А теперь отвечу на твой вопрос:
pdoTools был моим ответом на претензии в духе «MODX Revolution тормозной!!!111». Насколько я вижу, таких криков в интернетах сегодня почти нет. А тем, кто жалуется на Revolution, первым делом советуют попробовать pdoTools.
Ну и на закуску, попробуй в своей выборке подключить пару ТВ параметров и вывести их в обработанном виде, чтобы картинка тегом, а файл с полным путём от корня источника медиа — а потом сравни, насколько это будет сложнее, чем просто указать:
Если уж ты используешь минимум фукнций xPDO, то давай сравним вот так:
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig(array(
'select' => 'id,uri,pagetitle,content',
'limit' => 2000
));
$pdo->makeQuery();
$pdo->addSelects();
$query = $pdo->prepareQuery();
$query->execute();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0129349: Total time
6 029 312: Memory usage
А теперь твой xPDO пример, в котором добавлен вызов getSelectColumns, чтобы было по-честному:
$pdo = $modx->getService('pdoTools');
$q = $modx->newQuery('modResource');
$q->select($modx->getSelectColumns('modResource', 'modResource', '', array("id","uri","pagetitle","content")));
$q->limit(2000);
$s = $q->prepare();
$s->execute();
while($row = $s->fetch(PDO::FETCH_ASSOC)) {
print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0127289: Total time
5 767 168: Memory usage
И внезапно, скорость и потребление памяти практически идентичны! Циферки больше, потому что проверял на сервере h1, а не h3.
Никто не заставляет тебя использовать все методы pdoFetch, можно выбирать только нужные.
Если уж на то пошло, то вот абсолютный лидер по всем параметрам, включая количество строк:
$pdo = $modx->getService('pdoTools');
$q = $modx->prepare("SELECT `id`, `uri`, `pagetitle`, `content` FROM modx_site_content LIMIT 2000");
$q->execute();
while($row = $q->fetch(PDO::FETCH_ASSOC)) {
print $row['pagetitle'];
}
print '<pre>'; print_r($pdo->getTime()); print '</pre>';
0.0090590: Total time
4 980 736: Memory usage
А теперь отвечу на твой вопрос:
Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.
pdoTools был моим ответом на претензии в духе «MODX Revolution тормозной!!!111». Насколько я вижу, таких криков в интернетах сегодня почти нет. А тем, кто жалуется на Revolution, первым делом советуют попробовать pdoTools.
Ну и на закуску, попробуй в своей выборке подключить пару ТВ параметров и вывести их в обработанном виде, чтобы картинка тегом, а файл с полным путём от корня источника медиа — а потом сравни, насколько это будет сложнее, чем просто указать:
'includeTVs' => 'image,file',
'processTVs' => 1,
Оффтоп. Василий, ты специально убрал у измененного комментария надпись «комментарий изменен»?
Да, еще пару недель назад, потому что верстку ломает при больших ветках.
По моему, это никому не интересно, с первой попытки автор написал комментарий, или с десятой. Изменять комментарий, у которого уже есть ответы, всё равно нельзя.
Считаешь, нужно вернуть эту надпись?
По моему, это никому не интересно, с первой попытки автор написал комментарий, или с десятой. Изменять комментарий, у которого уже есть ответы, всё равно нельзя.
Считаешь, нужно вернуть эту надпись?
Абсолютно не настаиваю. Бывает читаю по почте, а потом если на modx.pro вижу, что изменен, то перечитываю. Дело привычки. Заметил, спросил.
Василий, вот зачем так много строк? Все то же самое на xPDO:$pdo = $modx->getService('pdoFetch'); $pdo->setConfig(array( 'select' => 'id,uri,pagetitle,content', 'limit' => 2000 )); $pdo->makeQuery(); $pdo->addSelects(); $query = $pdo->prepareQuery(); $query->execute(); while($row = $query->fetch(PDO::FETCH_ASSOC)) { print $row['pagetitle']; }
$q = $modx->newQuery('modResource');
$q->select(array("id","uri","pagetitle","content"));
$q->limit(2000);
$query = $q->prepare();
$query->execute();
while($row = $query->fetch(PDO::FETCH_ASSOC)) {
print $row['pagetitle'] . "\n";
}
Да, твой запрос сейчас максимально близок к чистому xPDO, но при этом все равно строк больше — раз, а во-вторых, зачем в таком случае изучать просто альтернативные методы вместо нативных? Это что касается скорости и синтаксиса.
Затем, что я привёл сравнение к одинаковому функционалу. Если не нужны дополнительные навороты из pdoTools — незачем его и использовать.
Однако, к моему коду можно легко добавить выборку ТВ параметров с обработкой, фильтрацию по родителям на определённой глубине с исключением определённых id и еще много всякого:
Лог работы:
Покажи пожалуйста, насколько меньше строк будет в твоей реализации на чистом xPDO.
Однако, к моему коду можно легко добавить выборку ТВ параметров с обработкой, фильтрацию по родителям на определённой глубине с исключением определённых id и еще много всякого:
$pdo = $modx->getService('pdoFetch');
$pdo->setConfig(array(
'select' => 'id,uri,pagetitle,content',
'includeTVs' => 'Date,List',
'processTVs' => 1,
'parents' => '5,-10',
'depth' => 2,
'limit' => 2000
));
$pdo->makeQuery();
$pdo->addTVs();
$pdo->addJoins();
$pdo->addSelects();
$pdo->addWhere();
$query = $pdo->prepareQuery();
$pdo->addTime('SQL prepared <small>"'.$query->queryString.'"</small>');
$query->execute();
echo '<pre>';print_r($pdo->getTime());echo '</pre>';
Лог работы:
0.0000291: xPDO query object created 0.0006900: Included list of tvs: Date, List 0.0026941: leftJoined modTemplateVarResource as TVdate 0.0002470: leftJoined modTemplateVarResource as TVlist 0.0001659: Added selection of modResource: SQL_CALC_FOUND_ROWS `id`, `uri`, `pagetitle`, `content` 0.0000451: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `Date` 0.0000069: Added selection of modTemplateVarResource: IFNULL(`value`, '') AS `List` 0.0010350: Processed additional conditions 0.0013552: Added where condition: modResource.parent:IN(5,10,14,49,51,11,12,13,50,52,53,11,12,13), modResource.parent:NOT IN(10) 0.0000041: Limited to 2000, offset 0 0.0000980: SQL prepared "SELECT SQL_CALC_FOUND_ROWS `modResource`.`id`, `modResource`.`uri`, `modResource`.`pagetitle`, `modResource`.`content`, IFNULL(`TVdate`.`value`, '') AS `Date`, IFNULL(`TVlist`.`value`, '') AS `List` FROM `modx_site_content` AS `modResource` LEFT JOIN `modx_site_tmplvar_contentvalues` `TVdate` ON `TVdate`.`contentid` = `modResource`.`id` AND `TVdate`.`tmplvarid` = 2 LEFT JOIN `modx_site_tmplvar_contentvalues` `TVlist` ON `TVlist`.`contentid` = `modResource`.`id` AND `TVlist`.`tmplvarid` = 1 WHERE ( `modResource`.`parent` IN (5,10,14,49,51,11,12,13,50,52,53,11,12,13) AND `modResource`.`parent` NOT IN (10) ) LIMIT 2000 " 0.0056591: Total time 4 718 592: Memory usage
Покажи пожалуйста, насколько меньше строк будет в твоей реализации на чистом xPDO.
Хорошо, в данном случае на xPDO больше строк придется написать.
Василий. Для чего ты использовал
$pdo = $modx->getService('pdoTools');
Если переменная $pdo в выборке не используется, только в конце показывает время работы скрипта.
Я использовал пример топикстартера.
Наверное, ему удобнее так подсчитывать время и ОЗУ, да и условия замеров должны быть одинаковыми.
Наверное, ему удобнее так подсчитывать время и ОЗУ, да и условия замеров должны быть одинаковыми.
Старый, добрый холивар с утра на любимом ресурсе. Люблю жизнь! :)) Топикстартер — тролль со стажем и выдумкой. :))
Ну не такой уж он и старый. Ему всего годик. :)
Это юмор, комрад. Просто юмор. Настроение с утра хорошее. :))
Ребят, я никого не хочу сталкивать лбами или тролить кого-то, как уже тут один «умник» написал. Я лишь поинтересовался. В моём посте так-то был конкретный вопрос. Кто на что ответил (видимо на то, что кого больше всего заботит), однако на вопрос в посте ответа я так и не нашёл. :)
P.S.: Хотя почитав комментарии стало вполне понятно многое. :)
P.S.: Хотя почитав комментарии стало вполне понятно многое. :)
Это не ответ на твой вопрос?
Разница между чистым xPDO и pdoTools в дополнительном функционале последнего. Если он тебе не нужен — не используй.
При этом дополнительный функционал можно включать по желанию, чтобы подобрать для себя оптимальное соотношение скорости и удобства.
У pdoTools есть еще одно хорошее качество — это определённая стандартизация функционала, чего нет у других разношерстных решений.
Если сниппет использует pdoTools, ты обычно можешь рассчитывать на выборку по родителям, INLINE чанки, подключение и фильтрацию ТВ и другие его общие функции.
А теперь отвечу на твой вопрос:
Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.
Разница между чистым xPDO и pdoTools в дополнительном функционале последнего. Если он тебе не нужен — не используй.
При этом дополнительный функционал можно включать по желанию, чтобы подобрать для себя оптимальное соотношение скорости и удобства.
У pdoTools есть еще одно хорошее качество — это определённая стандартизация функционала, чего нет у других разношерстных решений.
Если сниппет использует pdoTools, ты обычно можешь рассчитывать на выборку по родителям, INLINE чанки, подключение и фильтрацию ТВ и другие его общие функции.
Извиняюсь, не заметил того, что мне нужно. Спасибо, Василий.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.