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

cocoakekeyu · 发布于 2017年06月26日 · 最后由 jicheng1014 回复于 2017年06月29日 · 383 次阅读
6515d6

输出一个对象列表,这个对象有许多字段及关联字段要序列化为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。

共收到 8 条回复
2880

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

2456

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

6515d6
2880luikore 回复

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

6515d6
2456zlx_star 回复

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

2880

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

6515d6
2880luikore 回复

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

6515d6

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

10547

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

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