Coldfusion优化嵌套循环

时间:2016-03-03 09:35:16

标签: arrays loops coldfusion cfloop

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

1 个答案:

答案 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#">

运行它会产生一个带有两个键2016010120160102的结构,它将具有当天的收藏和转发的累计数量。