Что быстрее?

Что быстрее, <cfquery> или <cfloop>? Что быстрее, CFML или <cfscript>? Что быстрее, ... ? Если вы ColdFusion разработчик, то, несомненно, вам приходилось задавать эти вопросы себе (или вас спрашивали об этом).

 

Итак, что быстрее?

Одно время (до 4-ой версии) мы говорили, что <cfloop> очень медленный. Потом (после выхода CF 4) мы говорили, что <cfloop> был оптимизирован и превосходит <cfoutput>. Теперь, появление CFMX все поменялось. Итак, что же быстрее?

Конечно, вопросы относительно производительности вполне законны. Все мы постоянно ищем способы сделать наш код еще лучше. Но правда заключается в том, что это зависит не только он синтаксиса CFML; это затрагивает все виды написания кода, запросы к базам данных, планирование дизайна, организацию многократного использования и т.п.

Отладка приложений (debugging) ColdFusion помогате нам немного разбираться в этом. Вычисления времени обработки (всех страниц или ее части) позвояет глубже заклянуть в CF. Но для получения более подробной информации о производительности приложений, простой отладки не достаточно.

 

Немного о ColdFusion MX

Со времени выхода ColdFusion MX я пытался лучше понять, какие именно происходят процессы внутри него, чтобы писать более производительный код. И как многие из вас, я узнал о новом движке ColdFusion то, что большинство из советов и способов решения тех или иных задач теперь не применимы; некоторые оказывают на мой код ничтожное влияние, а некоторые просто ошибочны. Таким образом, я создал приложение - по-настоящему простой инструмент сравнения производительности, с использованием старого доброго ColdFusion. Работоспособность этого инструмента доказана на столько хорошо, что мне бы хотелось поделится им с вами. Читайте дальше.

 

Измеряем время обработки

Ключом к измерению любого времени обработки является интригующая маленькая функция под названием GetTickCount(). Функции GetTickCount() не нужны никакие параметры, и возвращает она число, которое и является полезным. Это число - количество миллисекунд.

Чтобы точно определить как долго обрабатывается линия кода, следует проделать следующее:
Одиночное измерение производительности дает бесполезные результаты, т.к. каждый раз может проходить то быстрее, то медленнее в зависимости от многих факторов. Чтобы понастоящему измерить время обрабоки страницы, код должен исполнятся повторно и каждое его выполнение должно быть индивидуально измерено и зафиксированно. Затем по всем сохраненным данным вычисляется среднее время обработки.

Самый простой способ сделать это в ColdFusion это пройтись циклом по обозначениям, сохраняя в массив каждый результат измерения. Например так:

Затем, чтобы получить среднее время обработки, можно просто использовать #ArrayAvg(timings)#, а получить общее, самое медленное и быстрое временя обработки можно так:
Всего: #ArraySum(timings)#
Самое медленное: #ArrayMax(timings)#
Самое быстрое: #ArrayMin(timings)#
Для сравнения двух вариантов, вам просто нужно повторить этот процесс дважды (сохраняя данные в два массива - для каждого вариата по одному массиву) и сравнить их результаты.

 

Отображаем результаты

Подробная отчетность бесполезна, пока не представлена в легко понимаемом формате. Тег <cfchart> (и сопутствующие ему теги) делают возможным отображать данные в высоко эффективном и читабельном формате.

Тег <cfchart> обычно используется для построения графиков на основе результатов запроса к базе данных, но, как показано в приведенном ниже примере, также можно использовать и самостоятельные данные используя тег <cfchartdata>. В этом примере, два массива (названные timings1 и timings2) графически отображены из самостоятельных наборов данных. Внутренние циклы от 1 до 100 и на каждой обработке передает значение массива (из обоих массивов) в тег <cfchart>.

 

Объединяем полученные знания

Последние несколько месяцев я постоянно использовал описанный выше код. Таким образом, чтобы проводить тесты быстрее и проще я создал приложение "Что быстрее?". Программа невероятно проста и ее идея в следующем:

Для своего теста (тест <cfloop> против <cfoutput>) я использовал три файла. Вот они:
Они просты и примитивны, но прекрасно подходят для такого вида тестирования - вам не потребуются дополнительные операции, т.к. они могут исказить результаты. Файл FORM.CFM (см. файл с примером) содержит код для формы запроса (Рисунок 1). Одна галочка (checkbox) "Exclude first iteration" отмечает, нужно ли пропустить первую обработку кода; поскольку при первом запуске ColdFusion понадобиться скомпилировать отрабатываемый файл, то время первой отработки будет гораздо медленнее и учитываться не должно.

Форма ввода настроек теста
Рисунок 1. Форма ввода настроек теста.

Файл PROCESS.CFM (см. файл с примером) обрабатывает данные формы. Сначала код использует тег и несколько условных опереторов <cfif>, чтобы определить и подготовить полученные данные. Если был указан предварительно обрабатываемый файл, то, соответственно, он отрабатывается. Далее, если была отмечена опция "Exclude first iteration", то все включаемые файлы подключаются (используя тег ) и по необходимости компилируются. Затем наступает сам тест; тег <cfloop> циклически повторяется от 1 до указанного количества раз (поле iterations в форме запроса), внутри каждого прохода обрабатываются оба файла и результаты помещаются в соответствующие массивы. В заключении результаты отображаются в пяти графиках (Рисунок 2). Первый показывает детали обработки, а остальные четыре - общее время теста, среднее, самое быстрое и самое медленное время обработки кода. (В случае, если вы удивитесь почему я использовал два массива вместо одного двумерного, то эти четыре графика все и объясняют; такие функции как ArraySum() и ArrayAvg() работают только с одномерными массивами).

Результаты теста отображаются тегом <cfchart>
Рисунок 2. Результаты теста отображаются тегом <cfchart>

 

Что следует из всего вышесказанного

Конечно, составляя эту статью я невольно задумался. Было бы не плохо, если вместо простого включения файлов тегом <cfinclude> в приложении можно было бы позволить:

Соблазнительно прямо сейчас модифицировать это приложение, но чтобы лучше его понять, я оставил это вам. Если вы посчитаете это приложение полезным и доработаете его, то, пожалуйста, дайте мне знать.

 

Заключение

Итак, что же быстрее, <cfloop> или <cfoutput>? Ответ: <cfloop> кажется немного быстрее, но это различие очень мало и несущественно. Что быстрее, CFML или <cfscript>? Ответ: разницы почти нет (пока я не запустил до смехотворного большой тест в 10 000 команд за каждый проход). Что быстрее? Теперь вы сами можете это выяснить – и не только с помощью элементов языка CFML, но и всех видов функциональностей, страниц, SQL выражений и т.д.

Файл с примером.


Источник: http://www.sys-con.com/coldfusion/articlea.cfm?id=568

 


Hosted by uCoz