Статьи

Метрики производительности для функций и операторов ColdFusion

… опубликовано :

Вы когда-нибудь замечали разработчиков, делающих заявления о том, насколько хорошо работают различные операторы и функции по сравнению с другими функциями и операторами? Например, насколько хорошо выполнять по сравнению с ? Есть ли действительно существенная разница?

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


# Столбец #
#Evaluate (колонка) #

Предполагалось, что вместо использования Evaluate (колонка) я должен был использовать GetUsers

, Теперь я хотел бы сказать пару вещей здесь. Прежде всего, это была простая демонстрация с использованием Evaluate (столбец) по сравнению с GetUsers.

не будет иметь никакого значения для производительности при отображении небольшого количества данных. Это просто личное предпочтение.

Теперь, я не оскорблен никакими замечаниями, подобными этому вообще. Мне нравится видеть, как другие люди кодируют свои приложения, и, эй, если это ускоряет мое приложение, чтобы использовать другой метод, я весь слух! Но иногда разработчики доводят вещи до крайности. Я решил провести некоторое исследование, чтобы выяснить, действительно ли использование Evaluate (колонка) было быстрее, чем GetUsers.

, Я поставил очень простой эксперимент, чтобы проверить это.

Этот эксперимент не был полностью всеобъемлющим, и я приглашаю всех опробовать этот эксперимент (на машине разработки, а не на живом сервере!) С различными переменными, чтобы увидеть, какие результаты вы получите.

Во-первых, вот код, который я использовал:


// это просто устанавливает тестовый запрос
qry = QueryNew ("col1, col2");
для (i = 1; i lte 10; i = i + 1) {
QueryAddRow (qry, 1);
QuerySetCell (qry, "col1", i * 2, qry.RecordCount);
QuerySetCell (qry, "col2", i * 3, qry.RecordCount);
}















Время всего процесса: # endTest # (мс)
Общее время цикла: # TotalTime # (мс)
Среднее время цикла: # AvgTime #

Я создал запрос, который был 2 столбца на 10 строк. Затем я повторил запрос 20000 раз. Внутри цикла запроса я перебрал переменную qry.ColumnList и установил переменную с именем temp в значение текущего столбца в текущей строке.

Обратите внимание, что я выполнил этот тест 20 раз, а затем изменил:

чтобы:

а затем запустил его еще 20 раз. Я записал общее количество времени, которое потребовалось для 20 000 итераций, среднее время для каждой итерации и общее время, необходимое для обработки всей страницы. Часовой пояс в миллисекундах. Чтобы сделать длинную историю немного короче, среднее время оценки с использованием записи массива составило 0,231 миллисекунды. (Да, это очень небольшое число.) Среднее время оценки с использованием Evaluate () составило .228 миллисекунд. Это еще меньшее число. Если вы посмотрите на данные, все числа, использующие Evaluate (), были меньше. Весь другой код остался точно таким же.

Между этими тестами я не перезагружал свой сервер, который мог немного изменить результаты из-за перекомпиляции и инициализации всего. Я сомневаюсь, что это оказало бы огромное влияние на результаты, хотя. А в реальной среде вы не перезапускаете сервер каждый раз, когда запускаете отчет, загружаете форму и т. Д.

Я собираюсь провести еще несколько тестов позже, чтобы посмотреть, какие результаты я получу. Я увеличу количество итераций до 100 000 и выполню в 50 раз. (Когда у меня будет время для этого ... Вероятно, потребуется каждый раз около 45 секунд.)

Я предполагаю, что моя точка зрения заключается в том, что для приложений малого и среднего размера использование Evaluate () не приведет к огромному узкому месту в вашей системе. Да, обычно есть другие способы обойти это, и если вам не нравится его использовать, то найдите другой способ обойти это. И это только один сценарий, использующий функцию Evaluate (). Есть множество других, и в других ситуациях Evaluate () может не работать вообще.

Вот несколько ссылок о производительности CF, которые могут вас заинтересовать:

http://www.markme.com/cantrell/archives/003088.cfm - производительность CFSCRIPT

http://www.findarticles.com/cf_dls/m0MLU/11_4/94550933/p1/article.jhtml - производительность CFIF

Загрузите электронную таблицу Excel с данными о производительности