ColdFusion: более эффективная structKeyExists() вместо isDefined()
Что из этого более эффективно в ColdFusion?
isDefined('url.myvar')
или же
structKeyExists(url, 'myvar')
2 ответа
В наши дни (CF8+) разница в скорости не так уж велика. Тем не мение, structKeyExists
действительно немного быстрее. Вот почему
Когда вы используете isDefined
строка, которую вы передаете, ищется как имя ключа в нескольких областях. Начиная с CF9, список областей в проверенном порядке: ( источник)
- Локальный (функция локальная, только UDF и CFC)
- аргументы
- Локальный поток (только внутри потоков)
- Запрос (не настоящая область, применяется к переменным внутри циклов запросов)
- Нить
- переменные
- CGI
- CFFile
- URL
- форма
- печенье
- клиент
Даже если вы используете имя области с isDefined
(лайк: if isDefined('variables.foo')
) список все равно будет проверяться по порядку; и если переменная local.variables.foo
определяется, он будет найден ДО variables.foo
,
С другой стороны, structKeyExists
только ищет структуру, которую вы передаете, на предмет наличия имени ключа; так что мест, куда придется искать, гораздо меньше.
Используя более явный код (structKeyExists
), вы не только получаете некоторую производительность, но и, на мой взгляд, ваш код более читабелен и удобен в обслуживании.
Используйте тот, который легче читать и лучше всего показывает, что вы делаете.
Разница между ними невероятно мала, и, скорее всего, об этом не стоит беспокоиться.
Не тратьте время на оптимизацию кода, если у вас нет проверенного и повторяемого контрольного примера, демонстрирующего медлительность.