2012-10-08 22 views
8

Tôi phát triển bằng cách sử dụng Coldfusion và muốn biết chiến lược tốt nhất để lặp qua tập kết quả truy vấn lớn là gì. Có bất kỳ sự khác biệt hiệu suất giữa việc sử dụng cfloop và cfoutput không? Nếu không, có lý do gì để thích cái này hơn cái kia không?cfloop vs cfoutput trên các truy vấn

Trả lời

12

Tôi tin rằng đã từng có. Tôi nghĩ rằng sự khác biệt này đã được giải quyết, đặt cược tốt nhất là làm một bài kiểm tra cho mỗi để kiểm tra trong trường hợp sử dụng cụ thể của bạn.

<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 
---> 

Có một số khác biệt đáng chú ý. cfoutput có thể thực hiện các vòng được nhóm, trong đó cfloop không thể.

<cfoutput query="qry" group="col"> 
    <!--- Loops once for each group ---> 
    <cfoutput> 
    <!--- Loops once for each record within the group ---> 
    </cfoutput> 
</cfoutput> 

Đối cfoutput bạn có thể chỉ định startrowmaxrows (hoặc số lượng) để đánh số trang kết quả của bạn. Đối với cfloop, bạn phải chỉ định chỉ mục endrow thay vì số.

Ngoài ra, bạn không thể sử dụng cfoutput cho truy vấn được lồng trong thẻ cfoutput hiện tại, trước tiên bạn cần phải kết thúc việc chứa cfoutput.

+3

Trong Coldfusion 10, bây giờ bạn có thể tạo đầu ra được nhóm. – ale

+1

Tốt, tôi lấy nó, bạn có nghĩa là nhóm cfloops http://www.bennadel.com/blog/2359-ColdFusion-10-Using-The-Group-Attribute-With-CFLoop-To-Group-Query-Rows.htm –

+0

Tương tự áp dụng cho Railo 4.0 –

1

Sẽ không có sự khác biệt về hiệu suất sử dụng một trong hai phương pháp, nó phụ thuộc vào kiểu mã hóa của bạn thực sự. Nếu bạn đặt <cfoutput> ở đầu và cuối mỗi trang thì sử dụng <cfloop> sẽ hoạt động tốt. Nếu bạn sử dụng nhiều <cfoutput> và chỉ nơi chúng cần thiết cũng hoạt động.

Cá nhân tôi đặt <cfoutput> chỉ khi chúng cần thiết, nhưng tôi sẽ không nói điều đó chính xác hơn là đặt chúng ở đầu và cuối trang.

+0

Bạn quên đề cập đến khả năng chỉ có thể sử dụng nhóm = "" với cfoutput (Railo 4 cho phép nhóm trên vòng lặp). – Busches

2

Tôi tin rằng đó là tất cả giống như hiệu suất, Ben Forta

Và phần còn lại là khá nhiều sở thích cá nhân như xa như cách bạn "like" để làm việc với vòng lặp của bạn. Hãy nhớ rằng bạn nên luôn luôn phạm vi biến của bạn, nhưng bên trong một vòng lặp cfoutput sẽ đặc biệt quan trọng vì các trường truy vấn "có thể" được tham chiếu mà không đề cập đến phạm vi của chúng.

một lý do bạn có thể thích phương pháp tiếp cận cfloop sẽ là nếu bạn cần "thoát" cfoutput trong vòng lặp của bạn vì bất kỳ lý do gì. Tôi đã chạy vào đó nhiều lần, vì vậy tôi thường thích cfloop.

3

Một lý do chính đáng để sử dụng cfloop thay vì cfoutput là nếu bạn cần lặp đầu ra truy vấn trong một đầu ra truy vấn cfoutput không hỗ trợ xuất kết quả truy vấn lồng nhau. Tuy nhiên bạn có thể thoát khỏi nó bằng cách sử dụng cfloops. Vì vậy:

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

không hoạt động, nhưng nếu bạn thay thế cfoutputs bằng cfloops, nó sẽ làm việc.

Kể từ CF10, với khả năng nhóm cfloops, đó là sự khác biệt duy nhất chức năng còn lại. Cả hai đều thực hiện tương tự.

Các vấn đề liên quan