Tôi đã nghe một số người lo lắng về việc chia nhỏ các chế độ xem Rails lớn thành các phần nhỏ hơn:Việc hiển thị một phần thực sự mất bao nhiêu thời gian? Tác động hiệu suất của việc gọi các phần tử có lớn hơn lợi ích về khả năng đọc mã không?
Tôi đã chạy một số con số để đưa ra ví dụ về cách kết xuất từng phần đơn giản so với kết xuất nội tuyến, vì vậy chúng ta có thể thảo luận về sự cân bằng sau. Đây là mã tôi đã sử dụng để làm điểm chuẩn, trong một ứng dụng Rails hoàn toàn mới (với config.cache_classes = true
):
<% require 'benchmark'
Benchmark.bmbm do |x|
x.report "inline" do
10000.times do -%>
<p>Hello!</p>
<% end
end
x.report "partial" do
10000.times do -%>
<%= render partial: "hello" %>
<% end
end-%>
<% end -%>
<p>Hello!</p>
Và kết quả (sử dụng Ruby 2.1 và Rails 4.0.2, trên Macbook Pro Retina 2013 15 ”):
Rehearsal -------------------------------------------
inline 0.010000 0.000000 0.010000 ( 0.007045)
partial 0.970000 0.090000 1.060000 ( 1.050433)
---------------------------------- total: 1.070000sec
user system total real
inline 0.010000 0.000000 0.010000 ( 0.005529)
partial 0.920000 0.070000 0.990000 ( 0.997491)
Vì vậy, kết xuất một phần chạy ở mức trung bình khoảng 0,1ms trên một máy tốc độ cao. Nó chậm hơn nhiều so với hiển thị nội tuyến, nhưng đủ nhanh để khó có thể nhận thấy khi bạn cũng có những thứ như tạo URL, trình trợ giúp Rails và thời gian hiển thị trình duyệt.
Tốc độ không phải là tất cả
Nếu hiệu suất của các phần tử hiển thị kém hơn nhiều, có lẽ tôi vẫn sẽ đưa ra quyết định chia nhỏ các lượt xem khổng lồ.
Có một cụm từ, Make It Work, Make It Right, Make It Fast. Khi bạn đang cố gắng khắc phục một chế độ xem quá lớn, bạn đang cố gắng thoát khỏi chế độ “Làm cho nó hoạt động” và bạn không thể bỏ qua phần “Làm cho nó nhanh”. Bạn sẽ làm cho mã của mình ít khả năng bảo trì hơn và bạn có thể bỏ lỡ một số cơ hội tái cấu trúc, điều này có thể dẫn đến cơ hội cho bộ nhớ đệm, điều này có thể dẫn đến lợi ích hiệu suất thậm chí còn lớn hơn.
Bạn sẽ không biết cho đến khi bạn đo lường
Bạn không cần phải tin vào những con số của tôi. Tôi khuyên bạn không nên làm như vậy! Thư viện Ruby’s Benchmark cung cấp cho bạn một số công cụ đơn giản để chạy các điểm chuẩn của riêng bạn. Ngoài ra còn có các công cụ để định hình toàn bộ ngăn xếp của bạn, như New Relic và MiniProfiler. Tôi thường xuyên sử dụng cả ba thứ này trong công việc hàng ngày của mình.
Khi bạn lập hồ sơ, hãy luôn lập hồ sơ ở chế độ sản xuất! Môi trường phát triển Rails tự động tải lại các lớp và chế độ xem, điều này rất hữu ích trong khi phát triển, nhưng sẽ giết chết số hiệu suất của bạn.