私は 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
cfoutput の代わりに cfloop を使用する正当な理由の 1 つは、別のクエリ出力内でクエリ出力をループする必要がある場合です。cfoutput はネストされたクエリ出力をサポートしていません。ただし、cfloops を使用して回避できます。そう:
<cfoutput query="test1">
#test1ID#
<cfoutput query="test2">
#test2ID#
</cfoutput>
</cfoutput>
動作しませんが、cfoutputs を cfloops に置き換えると動作します。
CF10 の時点で、cfloops をグループ化する機能が追加されましたが、それが唯一残っている機能上の違いです。どちらも同じように機能します。
パフォーマンスと同じだと思います、ベン・フォルタ
あとは、ループをどのように操作するのが好きかという点で、ほとんど個人的な好みです。常に変数のスコープを設定する必要がありますが、スコープを参照せずにクエリ フィールドを「参照できる」ため、cfoutput ループ内では特に重要です。
何らかの理由でループ中に cfoutput を「エスケープ」する必要がある場合は、cfloop アプローチを好む可能性があります。私は何度かそれに遭遇したので、一般的には cfloop を好みます。
どちらの方法を使用してもパフォーマンスに違いはありません。実際にはコーディング スタイルに依存します。<cfoutput>
すべてのページの上部と下部にa を配置すると、<cfloop>
うまく機能します。<cfoutput>
複数の必要な場所のみを使用する場合も同様に機能します。
個人的に<cfoutput>
は必要なところにだけ置いていますが、ページの上下に置くより正しいとは言えません。