ฉันได้ยินจากคนบางคนที่กังวลเกี่ยวกับการแยกมุมมอง Rails ขนาดใหญ่ออกเป็นส่วนที่เล็กกว่า:การแสดงบางส่วนใช้เวลานานเท่าใดจริง ๆ ผลกระทบด้านประสิทธิภาพของการโทรบางส่วนจะมีมากกว่าประโยชน์ในด้านความสามารถในการอ่านโค้ดหรือไม่
ฉันใช้ตัวเลขบางส่วนเพื่อยกตัวอย่างว่าการเรนเดอร์บางส่วนแบบง่ายเมื่อเปรียบเทียบกับการเรนเดอร์แบบอินไลน์ เพื่อให้เราสามารถพูดคุยเกี่ยวกับการแลกเปลี่ยนในภายหลัง นี่คือรหัสที่ฉันใช้วัดประสิทธิภาพในแอป Rails ใหม่ล่าสุด (พร้อม 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>
และผลลัพธ์ (โดยใช้ Ruby 2.1 และ Rails 4.0.2 บน Retina Macbook Pro รุ่น 15 นิ้ว ปี 2013):
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)
ดังนั้น การเรนเดอร์บางส่วนจึงทำงานโดยเฉลี่ยประมาณ 0.1ms บนเครื่องที่รวดเร็ว มันช้ากว่าการเรนเดอร์แบบอินไลน์มาก แต่เร็วพอที่คุณจะสังเกตเห็นได้ยากเมื่อคุณมีสิ่งต่าง ๆ เช่น การสร้าง URL ตัวช่วย Rails และเวลาในการแสดงผลของเบราว์เซอร์ให้นึกถึง
ความเร็วไม่ใช่ทุกอย่าง
หากประสิทธิภาพของการเรนเดอร์บางส่วนแย่ลงมาก ฉันยังคงต้องตัดสินใจแยกมุมมองที่กว้างใหญ่ออกไป
มีวลีที่ว่า Make It Work, Make It Right, Make It Fast. เมื่อคุณพยายามแก้ไขมุมมองที่ใหญ่เกินไป คุณกำลังพยายามออกจากโหมด "ทำให้ใช้งานได้" และคุณไม่สามารถข้ามไปที่ "ทำให้เร็ว" ได้ คุณจะทำให้โค้ดดูแลรักษาได้น้อยลง และคุณอาจพลาดโอกาสในการจัดองค์ประกอบใหม่ ซึ่งอาจนำไปสู่โอกาสในการแคช ซึ่งอาจนำไปสู่ประโยชน์ด้านประสิทธิภาพที่มากขึ้นไปอีก
คุณจะไม่รู้จนกว่าจะวัดผล
คุณไม่ต้องเชื่อตัวเลขของฉัน ฉันขอแนะนำว่าคุณทำไม่ได้! ไลบรารีเกณฑ์มาตรฐานของ Ruby มีเครื่องมือง่ายๆ ในการรันการวัดประสิทธิภาพของคุณเอง นอกจากนี้ยังมีเครื่องมือสำหรับสร้างโปรไฟล์เต็มสแต็กของคุณ เช่น New Relic และ MiniProfiler ฉันใช้ทั้งสามสิ่งนี้เป็นประจำในการทำงานประจำวันของฉัน
เมื่อคุณสร้างโปรไฟล์ โปรไฟล์ในโหมดการผลิตเสมอ! สภาพแวดล้อมการพัฒนา Rails จะโหลดคลาสและมุมมองใหม่โดยอัตโนมัติ ซึ่งมีประโยชน์ในขณะพัฒนา แต่จะทำลายประสิทธิภาพการทำงานของคุณ