解析大型JSON响应时响应缓慢

时间:2016-03-10 18:03:29

标签: json performance backbone.js backbone-collections

我开发了一个基于RESTFul设计的Web应用程序,其中应用程序从基于JAVA的Web服务获取JSON响应并在UI中显示并且每5秒刷新一次数据。 该应用程序使用Bootstrap进行UI设计,使用Backbone和require.js实现MVC结构,其中JSON响应被解析为Backbone集合。 当管理员使用此应用程序时,JSON响应大小太大(从800到1100个对象)。 这是事情变得混乱的地方。根据我的分析,浏览器占用了太多的资源。所以应用程序的其余部分非常慢。例如,如果我尝试打开模态,系统会冻结一段时间并慢慢打开,从而给用户带来非常糟糕的体验。 根据我的分析,正在分析解析数据的时间 作为补救措施,我将删除代码中的所有注释,并尝试为JSON文件/ html / css / js实现Gzip压缩。 JSON对象的样本粘贴在

下面
{
"name": "TEST",
"state": "Lunch",
"time": "00:00:09",
"manager": "TEST",
"site": "C",
"skill": "TEST",
"center": "TEST",
"teamLead": "TEST",
"workGroup": "TEST",
"lanId": "TEST",
"dbID": "TETS",
"loginId": "TEST",
"avgAcwTime": "nn",
"avgHandleTime": "nn",
"avgTalkTime": "nn",
"callsAnswered": "nn",
"dispSkill": "-",
"errCode": null,
"errDesc": null,
"avgAcwTimeth": "medium",
"avgHandleTimeth": "high",
"avgTalkTimeTh": "medium",
"callsAnsweredTh": "medium",
"stateTh": "high"

}

由于某些要求,无法完成Pagenation。 任何人都可以建议一些改善性能的方法

我也使用Backbone.Collection.fetch()

获取数据
getAgentMetric(){
this.metrices.fetch({
        url : (isLocal) ? ('http://localhost:8080/jsons/agent.json') : (prev_this.url + '/agentstat'),
        data: JSON.stringify(param),
        type: "POST",
        dataType: "JSON",
        contentType: "application/json",
        })
        .done(function() {
        // passing the datasource from ajax call
        prev_this.agentLoacalSource.localdata = prev_this.metrices.toJSON();
    });         
    timeout = setTimeout(_.bind(this.getAgentMetric, this), 5000);

},

1 个答案:

答案 0 :(得分:1)

浏览器可以处理超过一千个对象而没有任何压力,所以我不认为你只是从后端请求大量数据。你的一些解析或渲染代码很可能很慢。

一些可能性,而不再看到您的代码:

  • 这取决于你在这里做什么,但我会假设你没有使用模板库(hoganjs,handlebarsjs等)。你应该考虑使用一个,因为它们可以加快速度并使生成html变得更容易。
  • 您为每个呈现的模型运行.append()吗?这会让事情变慢。您应该生成所有需要生成的html,然后运行.append()一次。
  • 您为每个模型添加了哪种事件侦听器(如果有)?列出滚动事件而不进行去抖动会导致浏览器速度变慢,特别是如果你添加了大量的浏览器。

与您的缓慢问题无关,我在此代码中看到了一些问题:

  • 应该从ajax中的.always()函数调用超时,以防止并发请求因请求缓慢而无法出去。

    this.metrices.fetch(...) .always(function() { timeout = setTimeout(...); }.bind(this));

  • 仅提取数据的请求应使用GET而不是POST请求类型。您可以查看https://stackoverflow.com/a/3477374/5780021了解更多相关信息。

我建议您计算一些代码,看看实际发生的缓慢程度。这将允许您实际确定代码中点之间的时间。