它是低效的功能参数,使用隐式结构创建(又名速记或文字符号)?(Is it inefficient t

2019-09-27 12:00发布

和我一起承担这个...

说我有一个现有的结构:

<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"})>

我已经消除了额外的内存使用情况? 或者,将第二个参数的结构继续在一些秘密地点存在的功能,在这种情况下,我现在在一组冗余键/值的浪费内存已经executed--后,我甚至不能访问。

虽然我的主要关注的是内存使用,它可能不会伤害知道,如果最后的办法有其他缺点,如处理开销,相比第一。 我认识到,在任何我提出的方法之间的资源使用的差异在一个单一的执行情况将不会显著。 我想在更大的规模,用大量的数据和/或多次重复。

我目前在CF 9.0.1,如果该事项。

Answer 1:

是啊,直到下一次GC决定它需要清理的隐性结构会流连在内存中。 但它会获得创建只是或者您的相同structAppend()的例子。 唯一的区别是, struct2如果你这样做行内引用永远不会被创建。

我想,如果一个GC在请求的中间发生,内嵌版本会更迅速地成为被清理一样会有一个候选人 - 含蓄 - 是零个引用仍然使用它,而如果你给它一个名字,有一个参考在那里,它将无法使用GC,直到当参考本身已被破坏了请求结束后。



文章来源: Is it inefficient to use implicit struct creation (a.k.a. shorthand or literal notation) in function parameters?