Gần đây tôi đã chuyển từ chương trình phụ trợ I18n đơn giản mặc định sang chương trình phụ trợ Redis cho I18n của tôi. Tôi đã làm như vậy để giúp chúng tôi xử lý các bản dịch dễ dàng hơn, nhưng tôi thấy rằng có một hiệu suất đáng kể trên mỗi trang.Có phải Redis quá chậm để sản xuất Rails I18n không?
Tôi đã chạy một số Điểm chuẩn với Rails 3.2 và Redis 2.6.4 được cài đặt trên MBP của tôi để minh họa. Tôi đang sử dụng hiredis-rb làm khách hàng của mình.
Đó là sự khác biệt khá rõ ràng khi thực hiện hai chương trình phụ trợ khác nhau. Với sự phụ trợ đơn giản có sự chậm trễ ngắn về cuộc gọi đầu tiên - tôi giả bản dịch đang được nạp vào bộ nhớ - và hiệu suất thì lớn sau đó:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.143246
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.00415
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004153
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.004056
Các Redis backend là luôn chậm:
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122448
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.263564
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.232637
pry(main)> Benchmark.realtime { 500.times { I18n.t 'shared.slogan' } }
=> 0.122304
Điều này làm tôi cảm thấy tuyệt đối tại sao điều này lại chậm đối với I18n ... Tôi đang xếp hàng chục cuộc gọi I18n trong toàn bộ cơ sở mã của mình. Nếu tôi có thể trộn chúng lại với nhau, tôi sẽ có hình dạng tốt:
pry(main)> keys = $redis.keys[0..500]
pry(main)> Benchmark.realtime { $redis.mget keys }
=> 0.04264
Nhưng tôi thực sự không thấy cách nào để làm điều này với bất kỳ chương trình phụ trợ I18n hiện có nào. Có ai ngoài đó giải quyết vấn đề này không?
CHỈNH SỬA
Tôi lấy đề xuất của Chris Heald và tạo phụ trợ ghi nhớ một bộ nhớ cache đơn giản. Các ý chính là ở đây:
https://gist.github.com/wheeyls/5650947
Tôi sẽ cố gắng này ra trong một vài ngày và sau đó biến nó thành một viên ngọc.
CẬP NHẬT
Giải pháp của tôi là có sẵn như là một viên ngọc bây giờ:
https://github.com/wheeyls/cached_key_value_store
Và tôi cũng viết blog về vấn đề này:
http://about.g2crowd.com/faster-i18nredis-on-rails/
Máy chủ redis của bạn liên quan đến hộp chạy các điểm chuẩn này ở đâu? – deefour
Chúng được chạy trên máy cục bộ của tôi. Tôi sẽ chỉnh sửa câu hỏi của mình để làm rõ. – Wheeyls