我一直在开发我的第一个Rails应用程序,它突然变得非常缓慢。我不确定是什么导致了它。我已经添加了用于管理图像的回形针,并在开始变慢之前切换到使用Dropbox(而不是本地)存储,但我也做了一些无关的视图更改。导轨4视图渲染非常慢
现在,我对Rails和MVC Frameworks相对较新。所以我怀疑这是由于无知和缺乏经验而造成的错误。只是相同的无知和缺乏经验使诊断问题变得困难。
所以,这里是在使用“rails server”开发运行时的输出(尽管Heroku的生产速度并不快)。
Started GET "/games/index" for 217.156.133.130 at 2014-05-16 09:31:10 -0400
Started GET "/games/index" for 217.156.133.130 at 2014-05-16 09:31:10 -0400
Processing by GamesController#index as HTML
Processing by GamesController#index as HTML
Game Load (1.3ms) SELECT "games".* FROM "games" ORDER BY name ASC
Game Load (1.3ms) SELECT "games".* FROM "games" ORDER BY name ASC
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 9]]
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 9]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 9]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 9]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 5]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 5]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 5]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 5]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 7]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 7]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 7]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 7]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 12]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 12]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 12]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 12]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 2]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 2]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 2]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 2]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 10]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 10]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 10]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 10]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 23]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 23]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 23]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 23]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 18]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 18]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 18]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 18]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 3]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 3]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 3]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 3]]
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 13]]
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 13]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 13]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 13]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 24]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 24]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 24]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 24]]
(1.2ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 17]]
(1.2ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 17]]
User Load (0.8ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 17]]
User Load (0.8ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 17]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 4]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 4]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 4]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 4]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 8]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 8]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 8]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 8]]
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 19]]
(0.8ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 19]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 19]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 19]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 15]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 15]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 15]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 15]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 16]]
(0.6ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 16]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 16]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 16]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 20]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 20]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 20]]
User Load (0.4ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 20]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 21]]
(1.0ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 21]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 21]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 21]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 22]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 22]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 22]]
User Load (0.6ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 22]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 1]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 1]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 1]]
User Load (0.5ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 1]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 6]]
(0.9ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 6]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 6]]
User Load (0.7ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 6]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 11]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 11]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 11]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 11]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 14]]
(0.7ms) SELECT COUNT(*) FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 14]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 14]]
User Load (0.3ms) SELECT "users".* FROM "users" INNER JOIN "user_games" ON "users"."id" = "user_games"."user_id" WHERE "user_games"."game_id" = $1 [["game_id", 14]]
Rendered games/index.html.erb within layouts/application (77221.9ms)
Rendered games/index.html.erb within layouts/application (77221.9ms)
Completed 200 OK in 77227ms (Views: 77194.1ms | ActiveRecord: 31.4ms)
Completed 200 OK in 77227ms (Views: 77194.1ms | ActiveRecord: 31.4ms)
正如你所看到的视图正在将近一分钟,20秒的渲染,而数据库访问是不是一个真正的问题。这是渲染的视图。
<h1>All Games</h1>
<%= link_to "Add new", games_new_path %>
<% @games.each do |game| %>
<div class="game">
<div class="game_image">
<% if game.image.exists? %>
<%= image_tag game.image.url(:thumb) %>
<% end %>
</div>
<div class="game_info">
<h2><%= link_to game.name, game %></h2><%= link_to "Edit", edit_game_path(game) %><br />
<% if game.free %>
This game is free.<br />
<% if game.notes != "" %>
N.B. <%= game.notes %>
<% end %>
<% end %>
<%= game.users.size %> Players<br />
<div class="user_list">
<% game.users.each do |user| %>
<div class="user_thumb">
<% if user.avatar.exists? %>
<%= link_to image_tag(user.avatar.url(:pinky)), user %>
<% else %>
<div class="alt_link">
<%= link_to user.name, user %>
</div>
<% end %>
</div>
<% end %>
</div>
<div class="clear_div"></div>
</div>
</div>
<% end %>
我从只是一般的编程知识建议,我认为这是最昂贵的部分应该是每场比赛,我通过其所有用户的循环的事实(用户和游戏有不少一对多关系)。但是,数据库中的每张表格只有几十条记录...几乎没有任何数据需要处理,所以我不相信它应该真的很慢,这个很慢。
作为一个Rails新手,任何人都可以向我推荐一些步骤,我可以试着看看是什么导致了这个?我搜索了一下,我发现很多人都有这个问题,但显然有很多原因可以发生,因为我找到的东西已经解决了我的特殊问题。
编辑:添加Eager加载后,活动记录更快,但视图渲染仍然非常缓慢。
Started GET "/games/index" for 217.156.133.130 at 2014-05-16 10:07:07 -0400
Started GET "/games/index" for 217.156.133.130 at 2014-05-16 10:07:07 -0400
Processing by GamesController#index as HTML
Processing by GamesController#index as HTML
Game Load (1.1ms) SELECT "games".* FROM "games" ORDER BY name ASC
Game Load (1.1ms) SELECT "games".* FROM "games" ORDER BY name ASC
UserGame Load (0.8ms) SELECT "user_games".* FROM "user_games" WHERE "user_games"."game_id" IN (9, 5, 7, 12, 2, 10, 23, 18, 3, 13, 24, 17, 4, 8, 19, 15, 16, 20, 21, 22, 1, 6, 11, 14)
UserGame Load (0.8ms) SELECT "user_games".* FROM "user_games" WHERE "user_games"."game_id" IN (9, 5, 7, 12, 2, 10, 23, 18, 3, 13, 24, 17, 4, 8, 19, 15, 16, 20, 21, 22, 1, 6, 11, 14)
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 6, 4, 1, 9, 8, 11)
User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" IN (5, 6, 4, 1, 9, 8, 11)
Rendered games/index.html.erb within layouts/application (79191.5ms)
Rendered games/index.html.erb within layouts/application (79191.5ms)
Completed 200 OK in 79196ms (Views: 79191.6ms | ActiveRecord: 2.5ms)
Completed 200 OK in 79196ms (Views: 79191.6ms | ActiveRecord: 2.5ms)
你的控制器是什么?看起来像一个N + 1查询问题。你应该尝试加载'@games = Game.includes(:users)',如果你还没有完成那个 –
啊。这对我来说是新的。目前我有'@games = Game.all.order(“名字ASC”)' – Luke
我认为目前大约有20-25场比赛和15-20个用户。 – Luke