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
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
P.S. Второй способ у вас — PDO, а не xPDO.
Ну и fetch(PDO::FETCH_ASSOC) лучше было бы заменить на fetchAll, а потом пройтись по массиву, как в первом случае. Так условия для сравнения были бы ровнее (:
Fi1osofВообще-то самый что ни на есть xPDO.
— создается объект запроса xPDOQuery, который, как понятно из названия, имеет непосредственное отношение к xPDO.
Возвращает PDO-объект PDOStatement. Открою вам тайну: pdoTools, использующие в своей работе xPDO, так же в итоге приходят к этому объекту для выполнения запросов к БД, без этого просто никак.
Выполнение непосредственно запроса к БД. Так что здесь не только формирование запроса, но и выполнение его и обработка полученных данных.
А getCollection() — это не только все выше перечисленное, но еще и набивка данных в конечные xPDO-объекты. А это уже совсем другая задача. Ну и следует отметить, что в первом случае getCollection() тоже не выполняется, а просто так же выполняется запрос к БД и возвращаются полученные данные. getCollection() выполняется у pdoFetch в совсем другом методе.
Да, в этом тоже отличие этих двух примеров. В первом случае идет выборка сразу всех записей и возвращается конечный массив данных, а во втором случае идет построчный перебор полученного результата. Но, во-первых, это влияет на количество потребляемой памяти (что мы и видим наглядно), но на время выполнения почти не влияет. Что в одном случае, что в другом идет перебор 2000 результирующих записей. А во-вторых, здесь не должно быть цели приравнять результаты обоих вариантов к общему знаменателю. Здесь есть желание увидеть есть ли разница или нет. А разница безусловно будет. Объясню просто. Вот цепочка выполнения первого примера:
pdoTools -> xPDO -> PDO.
А вот цепочка второго примера:
xPDO -> PDO.
Найдите 10 отличий. Как ни крути, pdoTools не может быстрее работать, чем чистый xPDO, без которого сам pdoTools работать не может. Он может кому-то быть удобней в использовании, но не быстрее, потому что к выполнению первого варианта еще плюсуйте кучу методов отсюда, а второй вариант — конечный.
Именно по причине того, что многие не понимают до конца принципов работы xPDO, они и используют активно pdoTools искренне считая, что это самый быстрый и удобный способ взаимодействия с БД. Ну что? Василию надо отдать должное, он смог пропиарить свои наработки на базе массовой некомпетентности MODX-разработчиков. Ну, это уже каждому свое, и свое не каждому. Раз оно популярно, значит помогает в разработках. Но факт останется фактом — pdoTools никогда не будет работать быстрее и более гибко, чем чистый xPDO. Это можно даже тесты не проводить.
pdoTools это же просто библиотеки для разработки компонентов, что тут тестировать-то. Их или используют, кому это удобно, или не используют для разработки своих компонентов. Я не использую, ты тоже не используешь — ни хуже, ни лучше они от этого не становятся. А если кто-то пишет вместо слова getResources слово pdoResources и радуется разнице, то что в этом плохого? Ты же не думаешь, что количество скачиваний pdoTools означает, что столько людей используют их для разработки?
Fi1osofНиколай, вы наверно пользуетесь jQuery. Почему бы Вам не написать разработчикам и обозвать всех пользователей данной библиотеке некомпетентными, ведь чистый javascript быстрее. Ну раз уж у Вас столько свободного времени.
П.С. Ваши профессиональные советы и подсказки помогают многим и начинающим и опытным. Но читая данные посты складывается мнение, что это 2 разных человека. Детский сад, чесслово.
Fi1osofА коммент мой был ответом на другой коммент, не совсем корректный в техническом плане.
По поводу компетенций: сама модель MODX-а изначально ориентирована на не разработчиков. Это не секрет. И я уверен, что большинство MODX-разработчиков, как и в первом комментарии, не совсем отличит PDO от xPDO и т.п. Поэтому я и говорю про компетенции. Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.
Если разбирать Ваши статьи про Ваши же компоненты (ShopModxBox, modxSmarty и др.) по Вашим же критериям оценки подачи материала, то кроме пиара в них ничего нет — описываете практически те же достоинства — быстрые, удобные и т.п. Что естественно для специалиста — добиваться качественных результатов. Но к себе Вы не столько критичны. :)
В очередной раз поддерживаю предложение не плевать друг на друга, а направить свои усилия на развитие MODX. От этого больше пользы.
Fi1osofА вы меньше смотрите на мою бестактность и больше читайте суть техническую. Я программист, а не политик. Особо слова не выбираю. Но попробуйте сказать что техническое возражение мое на комментарий было не корректным. Где я там допустил ошибку и в чем? Меньше обращайте внимание на мой тон и больше на техническую составляющую, и вот вам больше пользы.
Николай, оно мне надо? Даже если бы у меня был Ваш уровень знаний, я бы не стал этого делать. У меня другие принципы. Я лучше потрачу это время на что-то хорошее.
Что и делаю. Пользуюсь и Вашими наработками и Василия. За что благодарен вам обоим. И многие благодарны. Но скатывание до базарных разборок печалит. Ну вот Пашок пришел сам к чистому xPDO после pdoTools. Процесс идет. Кому надо научатся.
Принцип Василия по разработке сайтов мне кажется логичным. Скачал необходимые пакеты и небольшими усилиями сделал сайт. А уж если есть претензии к скорости, то на последнем этапе оптимизировать узкие места. А придираться можно бесконечно.
Пашоккому сложнеекто только начинает вникать во всё это. А pdoTools отличный инструмент для движения к углублённому изучению MODx.Если уж ты используешь минимум фукнций xPDO, то давай сравним вот так:
А теперь твой xPDO пример, в котором добавлен вызов getSelectColumns, чтобы было по-честному:
И внезапно, скорость и потребление памяти практически идентичны! Циферки больше, потому что проверял на сервере h1, а не h3.
Никто не заставляет тебя использовать все методы pdoFetch, можно выбирать только нужные.
Если уж на то пошло, то вот абсолютный лидер по всем параметрам, включая количество строк:
А теперь отвечу на твой вопрос:
Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.
pdoTools был моим ответом на претензии в духе «MODX Revolution тормозной!!!111». Насколько я вижу, таких криков в интернетах сегодня почти нет. А тем, кто жалуется на Revolution, первым делом советуют попробовать pdoTools.
Ну и на закуску, попробуй в своей выборке подключить пару ТВ параметров и вывести их в обработанном виде, чтобы картинка тегом, а файл с полным путём от корня источника медиа — а потом сравни, насколько это будет сложнее, чем просто указать:
По моему, это никому не интересно, с первой попытки автор написал комментарий, или с десятой. Изменять комментарий, у которого уже есть ответы, всё равно нельзя.
Считаешь, нужно вернуть эту надпись?
Fi1osofДа, твой запрос сейчас максимально близок к чистому xPDO, но при этом все равно строк больше — раз, а во-вторых, зачем в таком случае изучать просто альтернативные методы вместо нативных?
Это что касается скорости и синтаксиса.
Однако, к моему коду можно легко добавить выборку ТВ параметров с обработкой, фильтрацию по родителям на определённой глубине с исключением определённых id и еще много всякого:
Лог работы:
Покажи пожалуйста, насколько меньше строк будет в твоей реализации на чистом xPDO.
Fi1osofЕсли переменная $pdo в выборке не используется, только в конце показывает время работы скрипта.
Наверное, ему удобнее так подсчитывать время и ОЗУ, да и условия замеров должны быть одинаковыми.
ПашокПашокP.S.: Хотя почитав комментарии стало вполне понятно многое. :)
Разница между чистым xPDO и pdoTools в дополнительном функционале последнего. Если он тебе не нужен — не используй.
При этом дополнительный функционал можно включать по желанию, чтобы подобрать для себя оптимальное соотношение скорости и удобства.
У pdoTools есть еще одно хорошее качество — это определённая стандартизация функционала, чего нет у других разношерстных решений.
Если сниппет использует pdoTools, ты обычно можешь рассчитывать на выборку по родителям, INLINE чанки, подключение и фильтрацию ТВ и другие его общие функции.
Пашок