我使用 ColdFusion 进行开发,想知道循环大型查询结果集的最佳策略是什么。使用 cfloop 和 cfoutput 之间有什么性能差异吗?如果不是,是否有任何理由更喜欢其中一个?
4 回答
我相信曾经有过。我认为这种差异已经得到解决,最好的办法是为每个测试做一个测试,以在你的特定用例中进行测试。
<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
。
使用 cfloop 而不是 cfoutput 的一个很好的理由是,如果您需要在另一个查询输出中循环查询输出,那么 cfoutput 不支持嵌套查询输出。但是,您可以使用 cfloops 摆脱它。所以:
<cfoutput query="test1">
#test1ID#
<cfoutput query="test2">
#test2ID#
</cfoutput>
</cfoutput>
不起作用,但如果你用 cfloops 替换 cfoutputs,它会的。
从 CF10 开始,能够对 cfloop 进行分组,这是唯一剩下的功能差异。他们都表现相同。
我相信这和表演一样,Ben Forta
至于你“喜欢”如何使用你的循环,其余的几乎都是个人喜好。请记住,您应该始终确定变量的范围,但在 cfoutput 循环中这一点尤其重要,因为“可以”在不引用其范围的情况下引用查询字段。
您可能更喜欢 cfloop 方法的一个原因是,如果您出于任何原因需要在循环期间“转义”cfoutput。我遇到过几次,所以我通常更喜欢cfloop。
使用任何一种方法都不会产生性能差异,这实际上取决于您的编码风格。如果您<cfoutput>
在每个页面的顶部和底部放置一个,那么使用效果<cfloop>
会很好。如果您使用多个<cfoutput>
且仅在需要它们的地方也可以使用。
我个人<cfoutput>
只把它们放在必要的地方,但我不会说这比把它们放在页面的顶部和底部更正确。