Rails Active Model Serializers 序列化耗时特别长

cocoakekeyu · 2017年06月26日 · 最后由 jicheng1014 回复于 2017年06月29日 · 2391 次阅读

输出一个对象列表,这个对象有许多字段及关联字段要序列化为 json,关联对象都使用 eager load 获取出来了。使用 active model serializers 作为序列化器,然后发现序列化好慢,这是 rails server 的 log:

20 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (297.45ms)
Completed 200 OK in 395ms (Views: 357.6ms | ActiveRecord: 15.6ms)

10 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (176.06ms)
Completed 200 OK in 240ms (Views: 226.6ms | ActiveRecord: 8.6ms)

5 个对象:

[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (60.54ms)
Completed 200 OK in 100ms (Views: 89.4ms | ActiveRecord: 7.6ms)

我在代码中直接序列化并计算时间如下:

某次数据库 SQL 的加载情况:

另外发现上面的时间是本地的机器,线上用的是青云性能主机,序列化耗时会增加 100 多 ms。

得看下 sql log, 有可能关联对象还是查了一遍

active model serializers 的性能其实并不怎么样,而且一不小心就会混入额外的查询。建议看序列化时生成的日志。

luikore 回复

sql log? 关联对象我都一次性获取了,不再是按需取,全都是 select * from table in [id]。

zlx_star 回复

它的写法很方便呢,想换一个对比一下。序列化时有产生的日志吗?

从你的 log 看感觉每个对象都有产生新查询... 我以前用这玩意的时候,也经常自信的觉得 eager load 了,但结果还是会产生 sql 查询,得一步一步的断着找...

luikore 回复

这些查询都是必须的,因为 topic 关联了七八个对象

精简 serializer 去掉一些不用的字段,把时间控制在 170ms 左右了。

哥哥,配个 newrelic 看看你这个访问 调用了多少次数据库就知道了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号