2016-03-02 96 views
0

我目前正在开发一个使用rails 5的api模式和角JS的SPA(shift planner)。 问题是浏览器需要1秒才能显示普通的JSON。 的JSON的结构是这样的:提高许多阵列JSON的性能

[ 
{ 
    "id": 2, 
    "name": "person0", 
    "skills": [ 
    { 
     "skill_id": 3, 
     "person_id": 2, 
     "name": "skill1" 
    }, 
    { 
     "skill_id": 6, 
     "person_id": 2, 
     "name": "skill4" 
    } 
    ], 
    "roles": [ 
    { 
     "name": "role4", 
     "id": 5, 
     "person_id": 2 
    }, 
    { 
     "name": "role8", 
     "id": 9, 
     "person_id": 2 
    } 
    ], 
    "languages": [ 
    { 
     "name": "language1", 
     "id": 2, 
     "person_id": 2 
    } 
    ], 
    "shifts": [ 
    { 
     "date_of_shift": "2016-02-29T00:00:00+00:00", 
     "shift_id": 1011, 
     "shift_type_id": 1, 
     "name": "shift_type0" 
    }, 
    { 
     "date_of_shift": "2016-03-01T00:00:00+00:00", 
     "shift_id": 1012, 
     "shift_type_id": 2, 
     "name": "shift_type1" 
    }, 
    { 
     "date_of_shift": "2016-03-02T00:00:00+00:00", 
     "shift_id": 1013, 
     "shift_type_id": 4, 
     "name": "shift_type3" 
    }, 
    { 
     "date_of_shift": "2016-03-03T00:00:00+00:00", 
     "shift_id": 1014, 
     "shift_type_id": 8, 
     "name": "shift_type7" 
    }, 
    { 
     "date_of_shift": "2016-03-04T00:00:00+00:00", 
     "shift_id": 1015, 
     "shift_type_id": 1, 
     "name": "shift_type0" 
    } 
    ] 
}, 

所以每个人都有约40元,我有50人(因为我想要显示的部门)在我的测试数据,这导致了2000 JSON元素。 所以我做了一些research显示json的速度有多快,看起来就像4年前,它比我的体验快得多。

这将是请求的railsserver的输出。

Completed 200 OK in 913ms (Views: 18.8ms | ActiveRecord: 73.3ms) 

当我让所有的人都在通过API的DB(2000年)为JSON

只需要300毫秒来完成显示JSON。

服务器输出:

Completed 200 OK in 335ms (Views: 329.8ms | ActiveRecord: 4.6ms) 

现在只需要方式更多的时间来呈现在服务器端的观点,但在活动记录和视图中花费的时间是一样的总时间,而在另一个API调用活动记录和视图只需要100毫秒和800毫秒花费做不同的事情。

人们JSON会是这个样子:

[ 
    { 
    "id": 1, 
    "name": "jonny", 
    "department_id": 1, 
    "created_at": "2016-02-04T13:33:34.357Z", 
    "updated_at": "2016-02-04T13:33:34.357Z" 
    }, 

只有2000次。

我使用psql query获取数据,它给我提供了我需要的数据。我不会在轨道上做任何其他事情。

这种行为对我来说非常混乱。有人可以解释这些差异以及它们为什么会发生,并希望在第一种情况下如何提高性能。

编辑:我试图从技能,角色和语言数组中删除person_id,但它几乎没有影响性能。

回答

0

我发现在轨的错误我所描述here

在格式化查询使它方法要慢。我的查询现在只需要160ms而不是900ms。只是因为我删除了所有不需要的空间。

0

从我看到的,看来你是从多个模型收集数据skills,languages,shifts等等。你的控制器是什么样的?主动记录呼叫的时间约为people的20倍。你有没有使用连接? http://edgeguides.rubyonrails.org/active_record_querying.html#joining-tables

如果没有,我可能会说这是一个问题,因为Active Record会为每个项目分别进行数据库查询。

+0

[this](http://pastebin.com/XZCL7kq2)是我的psql查询。我花了上一周的时间从1秒进行优化,只花费70毫秒(根据服务器日志)。查询完全给我我需要的东西。我没有在数据轨道上做任何其他的事情,尽管把它作为json – Elux91

+0

很好,如果没有花费时间在视图和模型中,mb花费这么长的时间来将查询的响应格式化为json之前发送给浏览器。 – Elux91

+0

这将是我的下一个猜测。你使用哪个json解析器?我不确定'oj'是否兼容rails 5,但可以尝试,因为它已知相对较快:https://rubygems.org/gems/oj/ –