Простой скрипт замера работы getintegrator, stmt или getcollection
Данные из таблицы в MODX можно выводить по-разному - с помощью $modx->getIntegrator, с помощью стандартных для PDO методов prepare(); и потом stmt->execute(); Есть еще getCollection . Выбирая, что применить, нашел эту статью, где сравнивают getcollection и pdo. Но нигде не нашел сравнения с getIntegrator, который должен быть легче для всего. В итоге с помощью доков и подручных средств набросал скрипт проверки работы для своего класса, может и вам пригодиться
$q = $modx->newQuery('ClassTable');
//условия для выборки или что-то еще, для реальной проверки, которая будет использоваться
$q->where(array('param'=>'value'));
$start = microtime(true);
$resultsIterator = $modx->getIterator('ClassTable', $q);
$resultsArrayIterator = [];
foreach ($resultsIterator as $result) {
$resultsArrayIterator[] = $result->toArray();
}
$end = microtime(true);
$timeIterator = $end - $start;
$countIterator = count($resultsArrayIterator);
$start = microtime(true);
$resultsCollection = $modx->getCollection('ClassTable', $q);
$resultsArrayCollection = [];
foreach ($resultsCollection as $result) {
$resultsArrayCollection[] = $result->toArray();
}
$end = microtime(true);
$timeCollection = $end - $start;
$countCollection = count($resultsArrayCollection);
$start = microtime(true);
$stmt = $q->prepare();
$stmt->execute();
$resultsArrayExecute = $stmt->fetchAll(PDO::FETCH_ASSOC);
$end = microtime(true);
$timeExecute = $end - $start;
$countExecute = count($resultsArrayExecute);
// Вывод результатов
echo "Результаты с использованием getIterator():\n";
echo "Количество результатов: " . $countIterator . "\n";
echo "Время выполнения: " . $timeIterator . " сек.\n\n";
echo "Результаты с использованием getCollection():\n";
echo "Количество результатов: " . $countCollection . "\n";
echo "Время выполнения: " . $timeCollection . " сек.\n\n";
echo "Результаты с использованием execute() и fetchAll():\n";
echo "Количество результатов: " . $countExecute . "\n";
echo "Время выполнения: " . $timeExecute . " сек.\n";
// Вывод массивов данных для проверки при необходимости
echo "Массив данных, полученный с использованием getIterator():\n";
var_dump($resultsArrayIterator);
echo "Массив данных, полученный с использованием getCollection():\n";
var_dump($resultsArrayCollection);
echo "Массив данных, полученный с использованием execute() и fetchAll():\n";
var_dump($resultsArrayExecute);
В итоге у меня были такие показатели
Результаты с использованием getIterator():
Количество результатов: 163
Время выполнения: 0,048829078674316 сек.
Результаты с использованием getCollection():
Количество результатов: 163
Время выполнения: 0,052037954330444 сек.
Результаты с использованием execute() и fetchAll():
Количество результатов: 163
Время выполнения: 0,0012261867523193 сек.
Но для справедливости замечу, что если не выводить массив, а проводить другие операции, то getIntegrator быстрее всех т.к. по умолчанию он не возвращает массив данных, а позволяет пошагово работать . Я же просчитывал именно с получением сразу массивом данных (его я буду передавать в чанк), поэтому для меня оказался быстрее метод pdo. Но это не значит, что и вам подойдет, просто я в восторге от этого скрипта и решил поделиться. Но я в восторге и от getIntegrator :-) вот официальная документация по нему https://docs.modx.com/3.x/ru/extending-modx/xpdo/class-reference/xpdo/xpdo.getiterator для небольшого объема данных он очень удобен. Вобщем я еще в сомнении, что все-таки применять, поэтому слишком серьезно не относитесь и прошу прощения, если этот код вызвал у вас стыд.