Неэффективно ли использовать неявное создание структуры (сокращенное или буквенное обозначение) в параметрах функции?

Потерпи меня на этом...

Скажем, у меня есть существующая структура:

<cfset struct1 = {key1 = "foo", key2 = "bar"}>

... к которому я хочу добавить несколько пар ключ / значение. Типичный подход будет выглядеть примерно так:

<cfset struct1.key3 = "baz">
<cfset struct1.key4 = "qux">
<cfset struct1.key5 = "quux">

В качестве альтернативы я мог бы использовать structAppend ():

<cfset struct2 = {key3 = "baz", key4 = "qux", key5 = "quux"}>
<cfset structAppend(struct1, struct2, false)>

... который имеет дополнительный бонус, позволяющий мне контролировать, перезаписываются ли существующие ключи. Я предполагаю, что недостатком является то, что он использует больше памяти, поскольку новые пары ключ / значение в конечном итоге будут существовать в двух разных местах. Но что, если я сделаю это вместо этого:

<cfset structAppend(struct1, {key3 = "baz", key4 = "qux", key5 = "quux"})>

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

Хотя моя основная задача - использование памяти, вероятно, не мешало бы узнать, имеет ли последний подход какие-либо другие недостатки, такие как накладные расходы обработки, по сравнению с первым. И я понимаю, что различия в использовании ресурсов между любыми представленными мною методами не будут значительными в одном сценарии выполнения. Я думаю о большем масштабе, с большим количеством данных и / или много повторений.

Я в настоящее время на CF 9.0.1, если это имеет значение.

1 ответ

Решение

Да, неявная структура будет зависать в памяти, пока следующий GC не решит, что ее нужно очистить. Но он будет создан точно так же с любым из ваших structAppend() Примеры. Разница лишь в том, что struct2 ссылка никогда не создается, если вы делаете это в строке.

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

Другие вопросы по тегам