Tips cải thiện hiệu năng code Rails

Tram Ho

Dùng where thay select

Khi thực hiện nhiều tính toán, càng load ít dữ liệu vào bộ nhớ càng tốt, luôn luôn dùng SQL query thay cho object method.

Ví dụ:

Code sẽ chạy nhanh hơn nếu viết thế này:

Dùng pluck thay map

Nếu chỉ quan tâm một vài giá trị mỗi hàng, nên dùng pluck thay map

Ví dụ:

Map sẽ load tất cả dữ liệu vào bộ nhớ trước, sau đó thực hiện lấy id, pluck nhanh hơn vì nó không phải load dữ liệu vào trước.

Dùng ActiveRecord::Calculations#sum thay Enumerable#sum

Thông thường khi thực hiện tính toán đôi khi chúng ta sử dụng Enumerable::sum để tính tổng, đây là một sai lầm thường gặp bởi vì ActiveRecord::Calculations đã cho ta cách để tính mà không cần load một đống dữ liệu vào bộ nhớ trước. Nếu bạn muốn thưc hiện tính toán theo cách của Rails, ActiveRecord::Calculations là lựa chọn tốt nhất để sử dụng.

Dùng ActiveRecord::Calculations#maximum thay Enumerable#max

Như đã giải thích ở trên, ta nên dùng ActiveRecord::Calculations để thực thiện việc tính toán

Dùng ActiveRecord::Calculations#minimum thay Enumerable#min

Dùng Model.find_each thay Model.all.each

Một sai lầm rất hay gặp đó là dùng ActiveRecord::Scoping::Named::ClassMethods#all + ActiveRecord::Result#each để lặp qua một bảng có hàng ngàn record.

Method all sẽ load tất cả dữ liệu vào bộ nhớ trước, điều này có thể dẫn đến nhiều vấn đề về bộ nhớ. Để cho rõ hơn, thì vấn để ở đây không phải là method all mà là số lượng records nó load ra.

Để xử lý, ta load records vào từng batch (mặc định là 1000 record):

Để custom số lượng record:

Có thể chỉ định điểm bắt đầu của batch, điều này hữu ích nếu có nhiều worker xử lý trong cùng 1 queue, bạn có thể cho 1 worker xử lý records từ id 1-5000, và worker còn lại xử lý record có id từ 500 trở đi.


Tham khảo: https://www.fastruby.io/blog/performance/rails/writing-fast-rails.html

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo