9

我使用 ColdFusion 进行开发,想知道循环大型查询结果集的最佳策略是什么。使用 cfloop 和 cfoutput 之间有什么性能差异吗?如果不是,是否有任何理由更喜欢其中一个?

4

4 回答 4

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您可以指定startrowmaxrows(或计数)来对结果进行分页。因为cfloop您必须指定endrow索引而不是计数。

此外,您不能cfoutput用于嵌套在现有cfoutput标签中的查询,您需要先结束包含cfoutput

于 2012-10-08T13:45:40.463 回答
3

使用 cfloop 而不是 cfoutput 的一个很好的理由是,如果您需要在另一个查询输出中循环查询输出​​,那么 cfoutput 不支持嵌套查询输出。但是,您可以使用 cfloops 摆脱它。所以:

<cfoutput query="test1">
   #test1ID#
   <cfoutput query="test2">
      #test2ID#
   </cfoutput>
</cfoutput>

不起作用,但如果你用 cfloops 替换 cfoutputs,它会的。

从 CF10 开始,能够对 cfloop 进行分组,这是唯一剩下的功能差异。他们都表现相同。

于 2012-10-08T15:34:48.460 回答
2

我相信这和表演一样,Ben Forta

至于你“喜欢”如何使用你的循环,其余的几乎都是个人喜好。请记住,您应该始终确定变量的范围,但在 cfoutput 循环中这一点尤其重要,因为“可以”在不引用其范围的情况下引用查询字段。

您可能更喜欢 cfloop 方法的一个原因是,如果您出于任何原因需要在循环期间“转义”cfoutput。我遇到过几次,所以我通常更喜欢cfloop。

于 2012-10-08T13:46:12.390 回答
1

使用任何一种方法都不会产生性能差异,这实际上取决于您的编码风格。如果您<cfoutput>在每个页面的顶部和底部放置一个,那么使用效果<cfloop>会很好。如果您使用多个<cfoutput>且仅在需要它们的地方也可以使用。

我个人<cfoutput>只把它们放在必要的地方,但我不会说这比把它们放在页面的顶部和底部更正确。

于 2012-10-08T13:44:07.403 回答