Итак, что быстрее?
Одно время (до 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>.Объединяем полученные знания
Последние несколько месяцев я постоянно использовал описанный выше код. Таким образом, чтобы проводить тесты быстрее и проще я создал приложение "Что быстрее?". Программа невероятно проста и ее идея в следующем:
Рисунок 1. Форма ввода настроек теста.
Рисунок 2. Результаты теста отображаются тегом <cfchart>
Что следует из всего вышесказанного
Конечно, составляя эту статью я невольно задумался. Было бы не плохо, если вместо простого включения файлов тегом <cfinclude> в приложении можно было бы позволить:
Заключение
Итак, что же быстрее, <cfloop> или <cfoutput>? Ответ: <cfloop> кажется немного быстрее, но это различие очень мало и несущественно. Что быстрее, CFML или <cfscript>? Ответ: разницы почти нет (пока я не запустил до смехотворного большой тест в 10 000 команд за каждый проход). Что быстрее? Теперь вы сами можете это выяснить – и не только с помощью элементов языка CFML, но и всех видов функциональностей, страниц, SQL выражений и т.д.
© 2002-2005 г. Вадим Пушкарев