我在循环中有一个循环,导致我的页面加载时间更长。使用更多数据,加载时间可以达到10,000毫秒,大约10秒。如何编写它以加快加载时间?我到目前为止的代码:
<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>
答案 0 :(得分:1)
查看您的代码,您可以做一些改进的事情
您的代码中有DeserializeJSON(cfhttp.fileContent)
四次。在第一个循环开始之前执行该操作并将其存储在新变量中会更有效。您当前在相同的字符串上多次执行相同的过程,这是不需要的。还注意到你的内外环都有index="i"
它们应该是不同的。
正如Adam在评论中所说,如果数据不经常变化,那么将其缓存/存储在某处而不是重新计算。计划任务对此有利,因为最终用户看不到它所花费的时间。
我想我可能希望重构只有一个循环 - 所以只循环你正在使用的返回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#">
运行它会产生一个带有两个键20160101
和20160102
的结构,它将具有当天的收藏和转发的累计数量。