2016-03-03 121 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这将有美食和锐推这一天的累积计数。