0

(这是我之前关于结构的问题的后续行动)

这会:

<cfset myArray = ArrayNew(1)>
<cfloop query="myQuery">
    <cfset myArray[1] = queryCol1>
    <cfset myArray[2] = queryCol2>
    <cfset myArray[3] = queryCol3>
    <cfset funcionWithArrayParam(myArray)>
</cfloop>

...比这更有效地使用系统资源:

<cfloop query="myQuery">
    <cfset functionWithArrayParam([queryCol1, queryCol2, queryCol3])>
</cfloop>

?

并且为了保持焦点狭窄,假设第一个示例中的数组除了提供函数之外没有其他用途。此外,假设查询和/或列数据足够大以使效率成为值得考虑的因素。

第二种方法因其紧凑性而具有吸引力,但我担心的是我不确定它在每次迭代中创建了多少新数组。我相信第一种方法会创建一个,因为数组是在 CF 中按值传递的。但这是否意味着第二种方法会创建两个数组(一个隐式创建的数组,以及它的一个副本以在函数中使用)?

了解速记符号如何在性能方面与用于填充数组的多个 cfset 语句进行比较也会很有趣。我意识到这不是苹果对苹果,因为前者也创建了数组,但仍然......我想我可以自己轻松地测试这个。

4

3 回答 3

2

性能方面,差异可以忽略不计,但隐式创建通常会稍微慢一些,但隐式的可读性要高得多,从长远来看,这更重要,除非您正在处理某种大规模的扩展问题。

编辑:写了一个快速测试脚本,我得到了完全不同的结果。我想说两者都非常接近,没关系,但在您的系统上运行测试。我在带有 CF10 的 Macbook Pro 上运行它,它可能会因您的具体实现而异。也许生成的 java 字节输出可能会揭示这两种方法之间的任何结构差异。

<cfset iterations = 1000000>

<cfset start = getTickCount()>

<cfloop from="1" to="#iterations#" index="x">
    <cfset a[x] = arrayNew(1)>
    <cfset a[x][1] = x>
    <cfset a[x][2] = x>
    <cfset a[x][3] = x>
</cfloop>
<cfoutput>Explicit Array took: #getTickCount()-start#ms</cfoutput><br>

<cfset start = getTickCount()>
<cfloop from="1" to="#iterations#" index="y">
    <cfset b[y] = [y, y, y]>
</cfloop>

<cfoutput>Implicit Array took: #getTickCount()-start#ms</cfoutput><br>
于 2013-09-10T17:54:12.593 回答
0

表现?别担心。任何需要循环去循环以放大被测操作的持续时间以使所述持续时间可测量的测试本质上都表明性能考虑可以忽略不计。

至于创建了多少个数组?在每个示例中,在调用代码中创建了一个数组,然后在传递给函数时它基本上是重复的。所以那里没有真正的区别。

它归结为您认为更易于维护的内容(我们可能会通过规定这将始终是答案来缩短您可能会遇到的后续问题)。

就我个人而言,我认为有单独的语句来设置每个数组元素看起来有点笨拙,因为可以一键完成。

于 2013-09-11T06:05:44.270 回答
0

亚当卡梅隆在他的一条评论中从技术上回答了我的问题,但由于这不是他的“官方”答案,我将提供我自己的(以及一点观点)。

答案是:是的。事实上,以我在第二个示例中演示的方式使用隐式数组创建是低效的。这是否意味着您大部分时间都无法摆脱它?当然不是!但是,我已经介绍了两种执行相同操作的方法,其中第二种在内存使用方面的效率是第一种的一半(甚至稍微慢一点)——在我的世界里,这值得了解!如果您仍然坚持在这种情况下使用隐式数组创建,那么问自己为什么可能不会有什么坏处。是不是因为你认为将代码压缩到一行会打动女孩程序员?我想那是什么。不过,“可读性”似乎是最流行的借口(毕竟,它是唯一的衡量隐式数组/结构创建在客观上并不逊于显式)如果像我一样,你发现可读性是一个模棱两可的、移动的目标,那么让效率影响你的编码方式并没有错。如果您知道如何编写高效的算法,请不要让流行的“过早优化”夸大其词吓到您改写效率低下的算法。就像过早优化一样,这表明缺乏远见。

于 2013-09-13T23:21:42.933 回答