Chúng tôi luôn sử dụng để đặt cấu hình ứng dụng của chúng tôi vào các tệp môi trường. Đó là không tốt cho quản lý sản xuất, vì vậy bây giờ chúng ta tải nó thông qua một initializer:Truy cập cấu hình ứng dụng Rails chậm - tại sao?
# myinitializer.rb
ApplicationConfig = YAML.load_file("#{Rails.root}/config/application/default.yml").symbolize_keys()
Ngay sau khi chúng tôi bắt đầu truy cập vào cấu hình thông qua ApplicationConfig
, hiệu suất thử nghiệm ứng dụng trở nên tồi tệ hơn nhiều. Một bộ rspec giảm từ 4 giây để 30.
Trong điều khiển ứng dụng của chúng tôi, chúng tôi cần phải thực hiện một số hành động sử dụng một before_filter
, mà làm việc như sau:
before_filter :extra_control
def extra_control
if ApplicationConfig.some_flag
...
end
end
Khai báo một trỏ biến để ApplicationConfig
khôi phục hoàn toàn hoạt động :
config = ApplicationConfig
def extra_control
if config.some_flag
...
end
end
Tại sao? Tại sao truy cập thông qua biến toàn cầu phá hủy hiệu suất? Chúng tôi làm điều này trong toàn bộ cơ sở mã trong các khung nhìn và các bộ điều khiển khác. Chúng ta có cần thực hiện điều này một cách khác không, ví dụ: bằng cách tiêm một biến mẫu vào tất cả các bộ điều khiển?
Chỉnh sửa: chúng tôi đã xác minh rằng mã tải cấu hình từ YAML được gọi chính xác một lần, vì vậy việc tải lặp lại dường như không phải là nguyên nhân gốc.
Chỉnh sửa: nó chỉ ra rằng đây là lỗi do biến cài đặt được tải dưới dạng chuỗi thay vì boolean, khiến ứng dụng đi vào mẫu ngủ thử nghiệm :(Rất tiếc, cảm ơn bạn đã thử 3 ngày trong cuộc đời của tôi Tôi sẽ không bao giờ quay lại!
Nó chỉ tồi tệ hơn trong môi trường thử nghiệm? Bạn đã kiểm tra ở giai đoạn nào trong môi trường thử nghiệm của bạn, trình khởi tạo được gọi? Bạn có thể làm như vậy thông qua trình gỡ rối hoặc bằng cách thêm một số bản in. – Anton
Tôi không có dữ liệu về việc nó chỉ chậm trong thử nghiệm, nhưng tôi biết rằng initializer được gọi chính xác một lần cả trong thử nghiệm và phát triển - vì vậy nó không phải là một cuộc gọi khởi tạo lặp lại làm chậm nó xuống. – xcut
Cũng lưu ý: hiệu suất làm chậm chỉ khi truy cập trực tiếp ApplicationConfig, nó biến mất khi gán nó cho một biến, như được hiển thị ở trên. – xcut