Coldfusion CFC производительность - PullRequest
1 голос
/ 27 марта 2012

Мы добавляем иерархические данные в наше приложение Coldfusion и разбиваем их на многочисленные CFC. В рассматриваемом CFC хранится массив его дочерних элементов, которые также являются экземплярами компонента того же типа. Парсинг некоторых из этих данных может привести к необходимости создания 100 или более (больше всего будет около 300) ХФУ к тому времени, когда это будет сделано ...

Иногда создание всех этих ХФУ может занять всего 50-75 мс, иногда это 1000-1250 мс. (Я создал скрипт, который зацикливает и просто создает и сохраняет эти объекты, используя GetTickCount () для отслеживания скорости.) Я знаю, что нагрузка на сервер, вероятно, во многом связана с этим, но мне было интересно, есть ли какой-то способ улучшить производительность создания этих объектов?

(Первое сражение состояло в том, чтобы получить все данные для этих объектов в одном вызове БД, что мы смогли сделать, но теперь, когда он работает последовательно, мы обнаружили, что создание группы этих ХФУ также может быть узким местом.)

Ответы [ 3 ]

3 голосов
/ 28 марта 2012

Самое эффективное, что вы можете сделать, это не воссоздавать объект при каждом запросе.Как вы поступите, зависит от конкретного случая использования.Одна вещь, которая может сработать для вас, если вы не имеете дело с огромным количеством уникальных объектов, - это иметь структуру кэша в области приложения, обозначенную чем-то вроде «#tablename # - # primarykey #».Когда вы собираетесь создать объект, сначала проверьте, существует ли первичный ключ в области приложения, если это произойдет, вы можете просто обновить данные в объекте и использовать его, в противном случае создать новый объект.Именно первоначальное создание объекта является наиболее сложной частью процесса.

<cfif not structkeyexists(application, "objectcache")>
    <cfset application.objectcache = {} />
</cfif>
<cfloop query="children">
    <cfif not structkeyexists(applicatin.objectcache, "childtable--#ID#")>
        <cfset application.objectcache = createobject(...).init(...) />
    </cfif>
    <cfset arrayappend(variables.instance.children, application.objectcache["childtable--#ID#"]) />
</cfloop>

Возможно, вы захотите добавить код вокруг кода, чтобы избежать проблем.Если у вас есть большое количество объектов, это может быть полезно, поскольку вы можете кэшировать 10 000 самых последних, используя флаги даты в объекте или в другой структуре.

2 голосов
/ 28 марта 2012

Суть в том, что создание объектов в ACF всегда занимало много памяти. С ACF9 стало лучше, но ненамного. Я могу гарантировать, что, взяв тот же код и запустив его на Railo (возможно, вам придется немного его изменить), вы увидите ОГРОМНОЕ улучшение в создании CFC и даже в потреблении памяти. Это не значит, что вам нужно переключать движки для вашего проекта, это просто говорит о том, что если вы используете ACF в качестве движка, вам нужно переосмыслить архитектуру своих приложений, используя слишком много CFC.

Тем не менее, первое, что нужно сделать, это спросить себя, действительно ли вам нужно создавать так много ХФУ? Столько, сколько люди хотят верить, что CFC - швейцарский армейский нож CFML, они - действительно обоюдоострый меч. Хотя они могут инкапсулировать логику для вас, они идут с компромиссом производительности. Очень часто я видел данные, вставленные в CFC, которые можно переписать для использования массивов и структур для представления структуры данных.

Так что в вашем случае, вместо того, чтобы ударить головой о стену, пытаясь заставить ACF сделать то, что он никогда не сделает (создание объекта эффективно), я бы посмотрел на переработку кода для использования массивов и структур и использования только ХФУ, когда это абсолютно необходимо.

1 голос
/ 28 марта 2012

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

Ваши представления почти всегда будут ссылаться на версию структуры объекта и его дочерних элементов, в то время как ваша модель должна будет обрабатывать как версию структуры, так и версию CFC при выполнении вызовов атрибутов. Этот подход приводит к противоречивому коду в том, как вы напрямую ссылаетесь на член объекта, но это будет значительно быстрее, чем попытка создать сотни или тысячи ХФУ одновременно.

...