我使用ColdFusion开发并想知道循环大查询结果集的最佳策略是什么。使用cfloop和cfoutput之间有任何性能差异吗?如果没有,是否有理由更喜欢一个而不是另一个?
答案 0 :(得分:12)
我相信曾经有过。我认为已经解决了这个差异,最好的办法是为每个测试特定用例进行测试。
<cfset t = GetTickCount()/>
<cf... query="qry">
<!--- Do something --->
</cf...>
<cfset dt = GetTickCount() - t/>
<cfdump var="#dt#"/>
<!---
If the differences are small you can use java.lang.System.nanoTime() instead
--->
但是有一些值得注意的差异。 cfoutput
可以执行分组循环,而cfloop
则不能。
<cfoutput query="qry" group="col">
<!--- Loops once for each group --->
<cfoutput>
<!--- Loops once for each record within the group --->
</cfoutput>
</cfoutput>
对于cfoutput
,您可以指定startrow
和maxrows
(或计数)来对结果进行分页。对于cfloop
,您必须指定endrow
索引而不是计数。
此外,您无法将cfoutput
用于嵌套在现有cfoutput
代码中的查询,您需要先结束包含cfoutput
。
答案 1 :(得分:3)
使用cfloop而不是cfoutput的一个好理由是,如果需要在另一个查询输出中循环查询输出,cfoutput不支持嵌套查询输出。然而,你可以使用cfloops逃脱它。所以:
<cfoutput query="test1">
#test1ID#
<cfoutput query="test2">
#test2ID#
</cfoutput>
</cfoutput>
不起作用,但如果用cfloops替换cfoutputs,它将会。
从CF10开始,具有分组cfloops的能力,这是剩下的唯一功能差异。它们都表现相同。
答案 2 :(得分:2)
我相信它与性能Ben Forta
完全相同就你如何“喜欢”使用你的循环而言,剩下的就是个人偏好。请记住,您应该始终对变量进行范围调整,但在cfoutput循环中这一点尤其重要,因为查询字段“可以”在不参考其范围的情况下被引用。
您可能更喜欢cfloop方法的一个原因是,如果您因任何原因需要在循环期间“转义”cfoutput。我已经遇到过好几次了,所以我一般都喜欢cfloop。
答案 3 :(得分:1)
使用任何一种方法都不会有性能差异,这实际上取决于您的编码风格。如果您在每个页面的顶部和底部放置<cfoutput>
,那么使用<cfloop>
将会很有效。如果您使用多个<cfoutput>
,并且仅在需要它们的位置也可以使用。
我个人只将<cfoutput>
放在必要的地方,但我不会说这比将它们放在页面的顶部和底部更正确。