2016-03-03 123 views
0

我有一個循環內的循環,導致我的頁面加載時間更長。有了更多的數據,加載時間可以達到10,000毫秒,這大約是10秒。我怎樣才能寫出更快的加載時間?我到目前爲止的代碼:Coldfusion優化嵌套循環

  <cfloop from="#endDate#" to="#startDate#" index="i" step="#CreateTimeSpan(+1,0,0,0)#"> 

       <cfset loopdate = dateformat(i,'mmm dd')> 

       <!---Loop the number of likes for each day---> 
       <cfset daylike = 0> 
       <cfset dayretweet = 0> 
       <cfset tweetrec = now()> 

       <cfloop from = 1 to = #arraylen(DeserializeJSON(cfhttp.fileContent))# index = "i">  
        <cfset tweetrec = dateformat(DeserializeJSON(cfhttp.fileContent)[i].created_at,'mmm dd')> 
        <cfif tweetrec IS loopdate> 
         <cfset daylike = daylike + DeserializeJSON(cfhttp.fileContent)[i].favorite_count> 
         <cfset dayretweet = dayretweet + DeserializeJSON(cfhttp.fileContent)[i].retweet_count> 
        </cfif> 
       </cfloop> 

       <!---add the favourites to array---> 
       <cfset myarray = ArrayAppend(likes, "#daylike#")> 

       <!--- Append dates to dates array ---> 
       <cfset myarray = ArrayAppend(dates, "#loopdate#")> 

       <!---Append retweets to retweets array ---> 
       <cfset myarray = ArrayAppend(retweetarr, "#dayretweet#")> 
      </cfloop> 
+2

輸入變化的頻率如何變化?日常?如果是這樣,不要在每個請求上都內聯,而是設置一個計劃任務來運行每個[[更改週期]](例如:每日)來執行處理,並將結果數據放入應用程序範圍中,或者緩存等。 –

+1

在代碼中有四次'DeserializeJSON(cfhttp.fileContent)'。在第一次循環開始之前這樣做會更有效率,並將其存儲在一個新變量中。您目前在同一個字符串上多次執行相同的過程,這不是必需的。也注意到你的內部和外部循環都有'index =「我」'他們應該是不同的。 –

+0

正如約翰指出的那樣,最大的收穫將是將'Deserialize'移到循環外部,然後將其變爲1循環而不是2。您還將'ArrayAppend'的結果(它只是一個真/假)賦值給一個完全被忽略的變量。您可以通過切換到'來節省幾個週期,但這只是比較小的。 –

回答

1

看你的代碼有一些事情可以做改進。
您的代碼中有DeserializeJSON(cfhttp.fileContent)四次。在第一次循環開始之前這樣做會更有效率,並將其存儲在一個新變量中。您目前在同一個字符串上多次執行相同的過程,這不是必需的。也注意到你的內外圈都有index="i"他們應該是不同的。

也正如亞當在評論中所說,如果數據不會經常改變,那麼將其緩存/存儲在某個地方而不是重新計算。由於最終用戶看不到所需的時間,因此計劃的任務對此很有幫助。

我想我可能會重構只有一個循環 - 所以只是循環在您正在使用的返回的JSON中的日期,並創建一個包含每天計數的新結構。因此,像這樣:

<cfsavecontent variable="cfhttp.fileContent">[ 
     { 
      "id": 1, 
      "created_at": "1 January 2016", 
      "favorite_count": 2, 
      "retweet_count": 10 
     }, 
     { 
      "id": 2, 
      "created_at": "2 January 2016", 
      "favorite_count": 4, 
      "retweet_count": 20 
     }, 
     { 
      "id": 3, 
      "created_at": "2 January 2016", 
      "favorite_count": 7, 
      "retweet_count": 5 
     }, 
     { 
      "id": 4, 
      "created_at": "2 January 2016", 
      "favorite_count": 7, 
      "retweet_count": 5 
     } 
] 
</cfsavecontent> 

<cfset data = DeserializeJSON(cfhttp.fileContent)> 

<!--- convert data to get counts per day... ---> 
<cfset dataPerDay = {}> 
<cfloop array="#data#" index="record"> 
    <!--- create a key which we can use to identity the date ---> 
    <cfset dateKey = DateFormat(record.created_at, "yyyymmdd")> 
    <cfif structKeyExists(dataPerDay, dateKey)> 
     <cfset dataPerDay[dateKey].favorite_count += record.favorite_count> 
     <cfset dataPerDay[dateKey].retweet_count += record.retweet_count> 
    <cfelse> 
     <cfset dataPerDay[dateKey] = { 
      favorite_count = record.favorite_count, 
      retweet_count = record.retweet_count 
     }> 
    </cfif> 
</cfloop> 

<cfdump var="#dataPerDay#"> 

運行會產生一個結構有兩個鍵2016010120160102這將有美食和銳推這一天的累積計數。