在 rails (500+) 中渲染许多部分很慢
Rendering many partials in rails (500+) is slow
我用 artist
、title
、duration
、release
等
为歌曲模型制作了部分 a
我想在一页上显示所有艺术家的歌曲,有时他们有很多。查询需要 0.08 秒,但我也看到了这个:
Rendered artist/_song_listing.html.haml (18.2ms)
Rendered artist/_song_listing.html.haml (8.5ms)
Rendered artist/_song_listing.html.haml (7.5ms)
Rendered artist/_song_listing.html.haml (9.6ms)
Rendered artist/_song_listing.html.haml (18.6ms)
Rendered artist/_song_listing.html.haml (12.6ms)
Rendered artist/_song_listing.html.haml (7.8ms)
Rendered artist/_song_listing.html.haml (19.5ms)
(等等)
最终这需要 14 秒,太长了。
这样使用偏音有错吗?有什么办法可以让它更快吗?
编辑:
艺术家控制器:
def show
@artist = Artist.find(params[:id])
@songs = @artist.songs.order('published_at DESC').includes(:members)
show.html.haml:
.panel.panel-default
- @artist.songs.each do |song|
=render 'song_listing', song: song
摘自_song_listing
(~500次):
.row
.col-xs-12
.summary
-if song.summary.present?
="#{song.summary.sanitize.strip.gsub("\u00A0"," ")}"
-else
%i
No Summary
.row
.col-xs-10
%ul.list-inline
- song.members.each do |member|
%li
%span
%img{src:"#{member.image_url}", width: '20px', height: '20px', class: 'img-circle'}
负载是否来自 SQL 查询?尝试在您的控制器中预加载。
@songs = Song.all.includes(:artist,:title)
然后是
@songs.each do |song|
# render logic here for each song
end
在包含中,您可以放置任何相关的关联,这些关联不会自动加载。
如果 SQL 查询是您的问题,这应该会使每个部分渲染更快。
第一次查找时要包含的进一步说明:
@artist = Artist.find(params[:id]).includes(:songs => [:members])
@songs = @artist.songs.order('published_at DESC')
我相信这会对您有所帮助。但是,您之前拥有的仍然可以。不确定“:members”两边的括号是否是必需的,但本质上你是在说,包括艺术家的歌曲,并且每首歌曲都包括它的成员。
听起来您可能正在为每首歌曲进行数据库查找。尝试在单个查询中加载所有歌曲数据。如果渲染确实是瓶颈,它也可能有助于 post 您的视图代码。
我知道已经很久了,但我认为对当前答案的改进也可能对其他人有所帮助
.panel.panel-default
=render partial: 'song_listing', collection: @artist.songs, as: :song
这在渲染方面要快得多。不如内联渲染快,但比对每个项目进行渲染要好得多。
我用 artist
、title
、duration
、release
等
我想在一页上显示所有艺术家的歌曲,有时他们有很多。查询需要 0.08 秒,但我也看到了这个:
Rendered artist/_song_listing.html.haml (18.2ms)
Rendered artist/_song_listing.html.haml (8.5ms)
Rendered artist/_song_listing.html.haml (7.5ms)
Rendered artist/_song_listing.html.haml (9.6ms)
Rendered artist/_song_listing.html.haml (18.6ms)
Rendered artist/_song_listing.html.haml (12.6ms)
Rendered artist/_song_listing.html.haml (7.8ms)
Rendered artist/_song_listing.html.haml (19.5ms)
(等等)
最终这需要 14 秒,太长了。
这样使用偏音有错吗?有什么办法可以让它更快吗?
编辑:
艺术家控制器:
def show
@artist = Artist.find(params[:id])
@songs = @artist.songs.order('published_at DESC').includes(:members)
show.html.haml:
.panel.panel-default
- @artist.songs.each do |song|
=render 'song_listing', song: song
摘自_song_listing
(~500次):
.row
.col-xs-12
.summary
-if song.summary.present?
="#{song.summary.sanitize.strip.gsub("\u00A0"," ")}"
-else
%i
No Summary
.row
.col-xs-10
%ul.list-inline
- song.members.each do |member|
%li
%span
%img{src:"#{member.image_url}", width: '20px', height: '20px', class: 'img-circle'}
负载是否来自 SQL 查询?尝试在您的控制器中预加载。
@songs = Song.all.includes(:artist,:title)
然后是
@songs.each do |song|
# render logic here for each song
end
在包含中,您可以放置任何相关的关联,这些关联不会自动加载。
如果 SQL 查询是您的问题,这应该会使每个部分渲染更快。
第一次查找时要包含的进一步说明:
@artist = Artist.find(params[:id]).includes(:songs => [:members])
@songs = @artist.songs.order('published_at DESC')
我相信这会对您有所帮助。但是,您之前拥有的仍然可以。不确定“:members”两边的括号是否是必需的,但本质上你是在说,包括艺术家的歌曲,并且每首歌曲都包括它的成员。
听起来您可能正在为每首歌曲进行数据库查找。尝试在单个查询中加载所有歌曲数据。如果渲染确实是瓶颈,它也可能有助于 post 您的视图代码。
我知道已经很久了,但我认为对当前答案的改进也可能对其他人有所帮助
.panel.panel-default
=render partial: 'song_listing', collection: @artist.songs, as: :song
这在渲染方面要快得多。不如内联渲染快,但比对每个项目进行渲染要好得多。