什么是"观点"指的是:989ms完成200 OK(浏览次数:968.5ms | ActiveRecord:13.9ms)

时间:2015-07-06 07:10:30

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

我有一个看起来像这样的动作:

  def facebook_login    
     render json: {users:User.all}
  end

在2013年早期的MacBook Pro上运行的本地服务器输出:

  

在989ms完成200 OK(浏览次数:968.5ms | ActiveRecord:13.9ms)

Heroku为同一个API调用输出:

  

在3849ms完成200 OK(浏览次数:3782.6ms | ActiveRecord:49.4ms)

Users表包含3000条记录。

这是users表的架构:

 create_table "users", force: :cascade do |t|
    t.string  "email"
    t.string  "first_name"
    t.string  "last_name"
    t.string  "gender"
    t.string  "birthday"
    t.string  "bio"
    t.string  "facebook_id"
    t.string  "avatar"
    t.string  "password_digest"
    t.string  "auth_token"
    t.boolean "admin",           default: false, null: false
  end

来自rails服务器的日志:

Started POST "/facebook_login.json" for 192.168.1.7 at 2015-07-06 03:39:07 -0400
Cannot render console from 192.168.1.7! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
Processing by HomeController#facebook_login as JSON
  Parameters: {"avatar"=>"https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpa1/v/t1.0-1/10891984_10100428479784882_2780393036688516385_n.jpg?oh=b745f67a9aa8f12eeb283962473bade0&oe=5621674B&__gda__=1444484154_c3db5d55964941a930530b70aa6ef44c", "first_name"=>"Tara", "bio"=>"", "last_name"=>"Lloyd", "birthday"=>"07/08/1985", "email"=>"tlloyd07@gmail.com", "facebook_id"=>"10100528233672292", "auth_token"=>"750435390234913", "home"=>{"avatar"=>"https://fbcdn-profile-a.akamaihd.net/hprofile-ak-xpa1/v/t1.0-1/10891984_10100428479784882_2780393036688516385_n.jpg?oh=b745f67a9aa8f12eeb283962473bade0&oe=5621674B&__gda__=1444484154_c3db5d55964941a930530b70aa6ef44c", "first_name"=>"Tara", "bio"=>"", "last_name"=>"Lloyd", "birthday"=>"07/08/1985", "email"=>"tlloyd07@gmail.com", "facebook_id"=>"10100528233672292", "auth_token"=>"750435390234913"}}
  User Load (13.6ms)  SELECT "users".* FROM "users"
Completed 200 OK in 989ms (Views: 968.5ms | ActiveRecord: 13.9ms)

我正在构建一个从数据库中提取数据并返回json的Rails应用程序。没有要渲染的图像或视图。为什么"观点"几乎一秒钟(Heroku上4秒),而ActiveRecord只有14ms?这是什么"观点"在做什么?所有这些API调用都是从Users表中读回3000条记录,那么为什么花费这么多时间花在" Views"?我错过了什么吗?

我尝试在我的环境/ development.rb中执行config.cache_classes = true,但它没有改变任何内容。

另外,我不明白为什么我为这个问题获得了6分。我冒犯了任何人,但暗示Rails很慢吗?

修改

更换后

  

渲染json:{users:User.all}

使用:

  

渲染json:MultiJson.dump({users:User.all})

我在Heroku日志中看到了这一点:

Completed 200 OK in 5223ms (Views: 0.3ms | ActiveRecord: 57.6ms)

然而,0.3ms + 57.5ms不等于5223ms,那么其他五秒花费的是什么?

1 个答案:

答案 0 :(得分:0)

经过大量的工作和调查,我了解到在Rails中渲染json总是比在数据库中渲染慢得多。因此,解决方案是绕过ActiveRecord并将直接SQL查询写入Postgres:

res = []
res << ActiveRecord::Base.connection.execute("select listings from listings;")
res << ActiveRecord::Base.connection.execute("select users from users;")
render json: MultiJson.dump(res)

在此之后,我看到性能和速度提高了10倍:

Started GET "/listings.json?data=(%0A%20%20%20%20settings,%0A%20%20%20%20listings,%0A%20%20%20%20users%0A)" for 192.168.1.7 at 2015-07-07 00:27:33 -0400
Processing by HomeController#listings as JSON
  Parameters: {"data"=>"(\n    settings,\n    listings,\n    users\n)", "home"=>{}}
   (24.4ms)  select listings from listings;
   (9.3ms)  select users from users;
Completed 200 OK in 200ms (Views: 0.1ms | ActiveRecord: 33.7ms)