xPDO vs pdoFetch

Решил затестить чистый xPDO на скорость и противопоставить ему pdoFetch.

Ничего не имею против первого или второго. Напротив. Второе использую в работе регулярно. Однако, как я понял, изучение и применение чистого 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
Пашок
06 апреля 2015, 20:50
modx.pro
5
4 742
+2

Комментарии: 28

Максим
07 апреля 2015, 00:31
0
А вопрос — откуда разница такая берется, так? Из метода $pdoFetch->run(), который кроме запроса в базу выполняет еще различные операции. Опять же в первом случае метод вернул массив, по которому прошлись для вывода pagetitle, во втором случае данные сразу отправляются из результата запроса на вывод. Тут уже сами решайте, какой способ для вашей задачи по выводу pagetitle лучше.
P.S. Второй способ у вас — PDO, а не xPDO.
    Максим
    07 апреля 2015, 00:50
    0
    Как-то не совсем я корректно ответил. Во втором случае от xPDO только формирование запроса, не хватает getCollection.
    Ну и fetch(PDO::FETCH_ASSOC) лучше было бы заменить на fetchAll, а потом пройтись по массиву, как в первом случае. Так условия для сравнения были бы ровнее (:
      Fi1osof
      07 апреля 2015, 01:37
      +1
      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. Это можно даже тесты не проводить.
        Максим
        07 апреля 2015, 02:18
        0
        Как ни крути, pdoTools не может быстрее работать, чем чистый xPDO, без которого сам pdoTools работать не может. Он может кому-то быть удобней в использовании, но не быстрее, потому что к выполнению первого варианта еще плюсуйте кучу методов отсюда, а второй вариант — конечный.
        Это я и хотел сказать, но за разъяснение нюансов все равно спасибо.

        Но факт останется фактом — pdoTools никогда не будет работать быстрее и более гибко, чем чистый xPDO. Это можно даже тесты не проводить.
        pdoTools это же просто библиотеки для разработки компонентов, что тут тестировать-то. Их или используют, кому это удобно, или не используют для разработки своих компонентов. Я не использую, ты тоже не используешь — ни хуже, ни лучше они от этого не становятся. А если кто-то пишет вместо слова getResources слово pdoResources и радуется разнице, то что в этом плохого? Ты же не думаешь, что количество скачиваний pdoTools означает, что столько людей используют их для разработки?
          Fi1osof
          07 апреля 2015, 02:22
          0
          На счет кол-ва использований вообще не спорю. Его много кто использует в том числе и за рубежом. Пруфф. Но топик касался сравнения скорости и ваши комментарии немного некорректными были, поэтому я и расставил точки над i. Если бы топик был о том кому что больше нравится, я бы не сунулся сюда.
            Максим
            07 апреля 2015, 02:29
            0
            Там названия пакетов, а используют сниппеты из комплекта, мне кажется, а не сами библиотеки непосредственно.
          Сергей Шлоков
          07 апреля 2015, 07:30
          0
          Опять 25. Все понимают, что pdoTools не может быть быстрее чистого xPDO. Но он быстрее базовых wayfinder'ов, getResources и т.п. Да и удобно иметь все в одном. Кроме того, Василий никого под страхом смерти не заставляет его использовать.
          Николай, вы наверно пользуетесь jQuery. Почему бы Вам не написать разработчикам и обозвать всех пользователей данной библиотеке некомпетентными, ведь чистый javascript быстрее. Ну раз уж у Вас столько свободного времени.
          П.С. Ваши профессиональные советы и подсказки помогают многим и начинающим и опытным. Но читая данные посты складывается мнение, что это 2 разных человека. Детский сад, чесслово.
            Fi1osof
            07 апреля 2015, 08:10
            0
            Эээ, чтобы вы понимали, топикстартер — не я :)
            А коммент мой был ответом на другой коммент, не совсем корректный в техническом плане.

            По поводу компетенций: сама модель MODX-а изначально ориентирована на не разработчиков. Это не секрет. И я уверен, что большинство MODX-разработчиков, как и в первом комментарии, не совсем отличит PDO от xPDO и т.п. Поэтому я и говорю про компетенции. Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.
              Сергей Шлоков
              07 апреля 2015, 08:48
              +1
              А коммент мой был ответом на другой коммент, не совсем корректный в техническом плане
              А Ваш некорректен в этическом плане. Оскорбление других не является показателем профессионализма.
              Поэтому я и говорю что из-за этого легче пиарить синтаксический сахар.
              Если разбирать Ваши статьи про Ваши же компоненты (ShopModxBox, modxSmarty и др.) по Вашим же критериям оценки подачи материала, то кроме пиара в них ничего нет — описываете практически те же достоинства — быстрые, удобные и т.п. Что естественно для специалиста — добиваться качественных результатов. Но к себе Вы не столько критичны. :)
              В очередной раз поддерживаю предложение не плевать друг на друга, а направить свои усилия на развитие MODX. От этого больше пользы.
                Fi1osof
                07 апреля 2015, 08:55
                0
                Но к себе Вы не столько критичны. :)
                Я очень к себе критичен. Потому и заставляю себя постоянно развиваться. Попробуйте вы разобрать мои наработки по гаечкам и уличить меня в некомпетентности.

                В очередной раз поддерживаю предложение не плевать друг на друга, а направить свои усилия на развитие MODX. От этого больше пользы.
                А вы меньше смотрите на мою бестактность и больше читайте суть техническую. Я программист, а не политик. Особо слова не выбираю. Но попробуйте сказать что техническое возражение мое на комментарий было не корректным. Где я там допустил ошибку и в чем? Меньше обращайте внимание на мой тон и больше на техническую составляющую, и вот вам больше пользы.
                  Сергей Шлоков
                  07 апреля 2015, 09:19
                  +1
                  Я программист, а не политик.
                  Ну тогда может не стоит и мучатся. Кидаться какашками — это уровень сами знаете кого. А мы все-таки доросли до Сапиенс. :)
                  Попробуйте вы разобрать мои наработки по гаечкам и уличить меня в некомпетентности.
                  Николай, оно мне надо? Даже если бы у меня был Ваш уровень знаний, я бы не стал этого делать. У меня другие принципы. Я лучше потрачу это время на что-то хорошее.
                  Меньше обращайте внимание на мой тон и больше на техническую составляющую, и вот вам больше пользы.
                  Что и делаю. Пользуюсь и Вашими наработками и Василия. За что благодарен вам обоим. И многие благодарны. Но скатывание до базарных разборок печалит. Ну вот Пашок пришел сам к чистому xPDO после pdoTools. Процесс идет. Кому надо научатся.
                  Принцип Василия по разработке сайтов мне кажется логичным. Скачал необходимые пакеты и небольшими усилиями сделал сайт. А уж если есть претензии к скорости, то на последнем этапе оптимизировать узкие места. А придираться можно бесконечно.
                    Пашок
                    Пашок
                    07 апреля 2015, 11:20
                    +1
                    Ну вот Пашок пришел сам к чистому xPDO после pdoTools. Процесс идет. Кому надо научатся.
                    Принцип Василия по разработке сайтов мне кажется логичным. Скачал необходимые пакеты и небольшими усилиями сделал сайт. А уж если есть претензии к скорости, то на последнем этапе оптимизировать узкие места. А придираться можно бесконечно.
                    Полностью согласен. Должен быть какой-то трамплин для тех, кому сложнее кто только начинает вникать во всё это. А pdoTools отличный инструмент для движения к углублённому изучению MODx.
        Василий Наумкин
        07 апреля 2015, 07:00
        +1
        Конечно, pdoTools не может работать быстрее, чем сам PDO, но сравнение твоё совсем не корректно.

        Если уж ты используешь минимум фукнций 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,
          Сергей Шлоков
          07 апреля 2015, 07:32
          0
          Оффтоп. Василий, ты специально убрал у измененного комментария надпись «комментарий изменен»?
            Василий Наумкин
            07 апреля 2015, 07:35
            0
            Да, еще пару недель назад, потому что верстку ломает при больших ветках.

            По моему, это никому не интересно, с первой попытки автор написал комментарий, или с десятой. Изменять комментарий, у которого уже есть ответы, всё равно нельзя.

            Считаешь, нужно вернуть эту надпись?
              Сергей Шлоков
              07 апреля 2015, 08:20
              0
              Абсолютно не настаиваю. Бывает читаю по почте, а потом если на modx.pro вижу, что изменен, то перечитываю. Дело привычки. Заметил, спросил.
            Fi1osof
            07 апреля 2015, 08:33
            -1
            $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'];
            }
            Василий, вот зачем так много строк? Все то же самое на xPDO:
            $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, но при этом все равно строк больше — раз, а во-вторых, зачем в таком случае изучать просто альтернативные методы вместо нативных?
            Это что касается скорости и синтаксиса.
              Василий Наумкин
              07 апреля 2015, 09:07
              +1
              Затем, что я привёл сравнение к одинаковому функционалу. Если не нужны дополнительные навороты из pdoTools — незачем его и использовать.

              Однако, к моему коду можно легко добавить выборку ТВ параметров с обработкой, фильтрацию по родителям на определённой глубине с исключением определённых 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.
                Fi1osof
                07 апреля 2015, 09:32
                0
                Хорошо, в данном случае на xPDO больше строк придется написать.
              Николай
              07 апреля 2015, 09:54
              0
              Василий. Для чего ты использовал
              $pdo = $modx->getService('pdoTools');
              Если переменная $pdo в выборке не используется, только в конце показывает время работы скрипта.
                Василий Наумкин
                07 апреля 2015, 09:56
                +1
                Я использовал пример топикстартера.

                Наверное, ему удобнее так подсчитывать время и ОЗУ, да и условия замеров должны быть одинаковыми.
              Wassi Wassinen
              07 апреля 2015, 09:06
              0
              Старый, добрый холивар с утра на любимом ресурсе. Люблю жизнь! :)) Топикстартер — тролль со стажем и выдумкой. :))
                Сергей Шлоков
                07 апреля 2015, 09:21
                0
                Ну не такой уж он и старый. Ему всего годик. :)
                  Пашок
                  Пашок
                  07 апреля 2015, 09:37
                  0
                    Wassi Wassinen
                    07 апреля 2015, 09:53
                    0
                    Это юмор, комрад. Просто юмор. Настроение с утра хорошее. :))
                  Пашок
                  Пашок
                  07 апреля 2015, 09:36
                  0
                  Ребят, я никого не хочу сталкивать лбами или тролить кого-то, как уже тут один «умник» написал. Я лишь поинтересовался. В моём посте так-то был конкретный вопрос. Кто на что ответил (видимо на то, что кого больше всего заботит), однако на вопрос в посте ответа я так и не нашёл. :)

                  P.S.: Хотя почитав комментарии стало вполне понятно многое. :)
                    Василий Наумкин
                    07 апреля 2015, 09:55
                    +2
                    Это не ответ на твой вопрос?
                    А теперь отвечу на твой вопрос:
                    Однако, как я понял, изучение и применение чистого xPDO в своих разработках серьёзно поможет снизить нагрузку на сервер, ведь верно?
                    Да, конечно. Нужно учить и xPDO, и PDO, и PHP, и MySQL, и еще много всего. Любые библиотеки, фреймворки и прочие вспомогательные инструменты — это надстройки над чем то, и они в принципе не могут быть быстрее этого чего то. Так что, основы нужно знать всегда.

                    Разница между чистым xPDO и pdoTools в дополнительном функционале последнего. Если он тебе не нужен — не используй.

                    При этом дополнительный функционал можно включать по желанию, чтобы подобрать для себя оптимальное соотношение скорости и удобства.

                    У pdoTools есть еще одно хорошее качество — это определённая стандартизация функционала, чего нет у других разношерстных решений.
                    Если сниппет использует pdoTools, ты обычно можешь рассчитывать на выборку по родителям, INLINE чанки, подключение и фильтрацию ТВ и другие его общие функции.
                      Пашок
                      Пашок
                      07 апреля 2015, 10:06
                      0
                      Извиняюсь, не заметил того, что мне нужно. Спасибо, Василий.
                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                    28