ответ

37

В эти дни (CF8 +) разница в скорости не что большой. Однако structKeyExists действительно немного быстрее. Вот почему.

Когда вы используете isDefined, строка, в которую вы проходите, определяется как имя ключа в нескольких областях. По состоянию на CF9, список областей, в порядке проверяемый: (source)

  1. Местная (локальная функция, UDF и ХФ только)
  2. Аргументов
  3. Thread локального (внутри потоков только)
  4. запросов (не истинный объем, применяется для переменных внутри циклов запросов)
  5. темы
  6. переменные
  7. CGI
  8. CFFile
  9. URL
  10. Форма
  11. Cookie
  12. Client

Даже если вы используете имя области с isDefined (как: if isDefined('variables.foo')) список все равно будет проверяться в порядке; и если определена переменная local.variables.foo, она будет найдена ДОvariables.foo.

С другой стороны, structKeyExists выполняет поиск только структуры, которую вы передаете, для существования имени ключа; так что там будет гораздо меньше мест, которые придется искать.

Используя более явный код (structKeyExists), вы не только получаете определенную производительность, но и, по моему мнению, ваш код более читабельен и поддерживается.

+0

Очень хорошо! Интересно посмотреть, как он обрабатывает функции по-разному. –

+0

Я также думаю, что ColdFusion должен запустить eval на строчке, которую вы предоставляете. StructKeyExists избегает много работы. –

+1

Есть одна большая проблема с 'structKeyExists()' хотя.Если вы десериализуете строку JSON с ColdFusion и у вас есть свойство myVal со значением «null», тогда 'structKeyExists (object,« myVal »)' вернет 'true', а' isDefined ("object.myVal") 'не будет. Или, другими словами, если вы попытаетесь получить доступ к свойству с помощью 'object.myVal' после проверки с помощью structKeyExists()', вы получите сообщение об ошибке. – android

10

Использовать тот, который проще для чтения и лучше всего показывает, что вы делаете.

Разница между двумя: невероятно маленький, и очень вероятно не стоит беспокоиться.

Не тратьте время на оптимизацию кода, если у вас есть доказали и повторяемые тестовый случай который демонстрирует медлительности.

+1

+1. Определенно стоит понимать, как работают две функции. Но, если у вас нет проблемы с производительностью , писать читаемый код, который ведет себя правильно, гораздо важнее IMO. – Leigh

+0

Я полностью согласен, но я по-прежнему являюсь постоянным пользователем 'structKeyExists'. Я нахожу, что его явный характер делает все кристально чистым, где 'isDefined' не всегда, что приводит к большему времени и головным болям при возвращении к старому коду (и/или чужому коду) месяцев или лет спустя. –

+0

Хотя IsDefined() более интуитивно назван, то, что вы только что описали, по-прежнему является лучшей причиной выбора одного над другим, чем преждевременные опасения относительно производительности. По крайней мере IMHO ;-) - Leigh 8 мин. Назад – Leigh