【问题标题】:What is the "Views" referring to in: Completed 200 OK in 989ms (Views: 968.5ms | ActiveRecord: 13.9ms)什么是“Views”指的是: Completed 200 OK in 989ms (Views: 968.5ms | ActiveRecord: 13.9ms)
【发布时间】:2015-07-06 07:10:29
【问题描述】:

我有一个如下所示的操作:

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

我在 2013 年初的 MacBook Pro 上运行的本地服务器输出如下:

在 989 毫秒内完成 200 次 OK(查看次数:968.5 毫秒 | ActiveRecord:13.9 毫秒)

Heroku 为同一个 API 调用输出这个:

在 3849 毫秒内完成 200 次 OK(查看次数:3782.6 毫秒 | ActiveRecord:49.4 毫秒)

Users 表包含 3000 条记录。

这是用户表的架构:

 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 应用程序。没有要渲染的图像或视图。为什么 ActiveRecord 只有 14 毫秒,而“视图”几乎是 1 秒(Heroku 上是 4 秒)?这个“观点”在做什么?所有这些 API 调用都是从用户表中读取 3000 条记录,那么为什么要花这么多时间在“视图”上呢?我错过了什么吗?

我尝试在我的环境/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,那么其他 5 秒花费在什么上面?

【问题讨论】:

  • 基于你的代码,你永远不能断言某事很慢。
  • 我把问题扩展了很多,请看一下
  • 版主,请重新打开问题,否则我将删除它并再次提问
  • 我也很困惑为什么会被调低。对我来说似乎是一个合法的问题。

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


【解决方案1】:

经过大量工作和调查,我了解到在 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)

【讨论】:

    猜你喜欢
    • 2022-12-02
    • 1970-01-01
    • 2010-11-04
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    • 1970-01-01
    • 2017-11-24
    相关资源
    最近更新 更多