Стоимость ColdFusion для FileExists - PullRequest
1 голос
/ 17 июня 2010

Я хочу:

  • на каждой странице,
  • проверить, существует ли файл
  • включить этот файл, если ИСТИНА

т.е:.

 <cfset variables.includes.header = ExpandPath("_inc_header.cfm")>
 <cfif FileExists(variables.includes.header)>
   <cfinclude template = "_inc_header.cfm">
 </cfif>

Это хорошая идея?

отредактировано для использования просто "_inc_header.cfm" в качестве шаблона

Альтернативное практическое использование было бы чем-то похожим на этот код PHP:

foreach (glob("includes/*.php") as $inc) {
   require($inc);
}

Ответы [ 6 ]

2 голосов
/ 05 февраля 2012

У меня был тот же вопрос, потому что у меня есть список из сотен элементов, каждый из которых связан с одним или несколькими файлами.Я хочу проверить существование каждого файла, чтобы иметь обзор.Поскольку я не нашел здесь ответа, я поставил галочку в функции FileExists в своем списке, и в результате было получено: «Общее время выполнения FileExits 7 876 файлов: 0,11 с.»

Я думаю, что скорость абсолютно не проблемаFileExits.

1 голос
/ 17 июня 2010

В зависимости от трафика, производительность может немного ухудшиться.

Не могли бы вы включить оператор включения в попытку / отлов или, если это не удалось, возможно, сохранить результат проверки в сеансе, а затем просто выполнить проверку один раз для файла за сеанс?

0 голосов
/ 29 июля 2010

Раньше я думал так же, как и вы, но я также тщательно отслеживаю время выполнения.После перехода на систему, которая вызывает FileExists несколько раз за запрос, я заметил разницу в 0 мс в миллисекундах, необходимых для загрузки страниц.Вполне вероятно, что любой частый поиск данного файла приведет к его кешированию где-нибудь в системе, драйверах SCSI или оборудовании диска.Еще более вероятно, что время поиска на оборудовании SCSI составляет менее миллисекунды.

Учитывая, что я интенсивно использую cfinclude, неудивительно, что еще один поиск даже не отображается на радаре.

РеальностьЕсли бы у вас не было миллионов файлов в каталоге, или вы запускаете веб-сервер с IDE-дисков или что-то глупое, то это, вероятно, будет иметь больше издержек, чем поиск переменных, но мы, вероятно, говорим о разнице в 0,0001 миллисекунды.Дополнительная сложность кода, вероятно, не стоит экономить, если вы /.или Apple, или что-то.

Тем, кто говорит, что это плохая архитектура, я позволю себе не согласиться.В среднесрочной и долгосрочной перспективе вы можете купить процессоры намного дешевле, чем время разработчиков.Иметь систему, которая требует только изменения файлов, проще, чем изменение файлов И переменных - и иметь дело с дополнительной сложностью.Как и большинство вещей в категории оптимизации, многие задачи, которые экономят несколько MS, могут занимать часы, которые можно потратить на более эффективные меры, такие как улучшение кеша.

0 голосов
/ 25 июня 2010

Я бы, вероятно, создал бы переменную приложения с именем application.header и поместил бы html из заголовка.

Затем в каждом приложении я могу проверять оба isdefined и, если не ноль.1004 * Например:

В application.cfm

<cfparam name="application.header=" default="">
<cfset application.header="<img src=/images/logo.png alt='Logo' border=0>" />

На странице вашего приложения.

<cfif isdefined("application.header") and application.header gt "">
<cfoutput>
#application.header#
</cfoutput>
</cfif>

И вот вы идете ..

0 голосов
/ 17 июня 2010

Вопрос: как бы вы включили файл с абсолютным путем к файлу, возвращаемым ExpandPath("_inc_header.cfm")?

В любом случае, ваш вопрос должен звучать как "Стоимость скорости ColdFusion ExpandPath + FileExists", потому что каждый раз вызывается две функции.

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

0 голосов
/ 17 июня 2010

Я думаю, что лучший способ - просто проверить наличие переменной header в структуре variables.include:

<cfif structkeyexists(variables.includes, "header")>
  <cfinclude template = "#variables.includes.header#">
</cfif>

, если страница не будет использовать заголовок, то на вашей страницеКод удалить заголовок:

<cfset structdelete(variables.include, "header", false)>
...