0

我在一个循环中有一个循环,导致我的页面加载时间更长。使用更多数据,加载时间可以达到 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>
4

1 回答 1

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会累积当天的收藏和转发次数。

于 2016-03-03T11:36:11.223 回答