2008-08-27 34 views
29

Cách tốt nhất để cấu hình hành động bộ điều khiển trong Ruby on Rails là gì. Hiện tại tôi đang sử dụng phương pháp brute-force để ném trong các cuộc gọi puts Time.now giữa những gì tôi nghĩ sẽ là một nút cổ chai. Nhưng điều đó cảm thấy thực sự, thực sự bẩn thỉu. Co cach tôt hơn ma.Cấu hình hành động của trình điều khiển đường ray

Trả lời

9

Sử dụng thư viện chuẩn Benchmark và các thử nghiệm khác nhau có sẵn trong Rails (đơn vị, chức năng, tích hợp). Dưới đây là ví dụ:

def test_do_something 
    elapsed_time = Benchmark.realtime do 
    100.downto(1) do |index| 
     # do something here 
    end 
    end 
    assert elapsed_time < SOME_LIMIT 
end 

Vì vậy, ở đây chúng tôi chỉ thực hiện 100 lần, thông qua thư viện Điểm chuẩn và đảm bảo mất ít hơn SOME_LIMIT lượng thời gian.

Bạn cũng có thể thấy các liên kết này hữu ích: Benchmark.realtime referenceTest::Unit reference. Ngoài ra, nếu bạn đang đọc sách 'đọc sách', tôi đã chọn ý tưởng cho ví dụ từ Agile Web Development with Rails, nói về tất cả các loại thử nghiệm khác nhau và một chút về thử nghiệm hiệu suất.

+3

Câu trả lời này sẽ cho bạn biết làm thế nào để chắc chắn rằng hành động của bạn đang chạy một cách nhanh chóng đủ. Nó không giúp bạn với hồ sơ, mà là tìm ra một phần của hành động là dành nhiều thời gian nhất. –

1

Bạn có thể muốn cung cấp cho các dịch vụ FiveRuns TuneUp thử, vì nó thực sự khá ấn tượng. Tuyên bố từ chối trách nhiệm: Tôi không liên kết với FiveRuns theo bất kỳ cách nào, tôi vừa thử dịch vụ này.

TuneUp là dịch vụ miễn phí, theo đó bạn tải xuống plugin và khi bạn chạy ứng dụng, nó sẽ chèn một bảng ở đầu màn hình có thể được mở rộng để hiển thị số liệu hiệu suất chi tiết.

Nó cung cấp cho bạn một số biểu đồ đẹp, bao gồm một biểu đồ cho biết tỷ lệ thời gian được sử dụng trong Mô hình, Chế độ xem và Bộ điều khiển. Bạn thậm chí có thể khoan xuống ngay để xem các truy vấn SQL riêng lẻ mà ActiveRecord đang thực thi nếu bạn cần và nó có thể hiển thị cho bạn lược đồ cơ sở dữ liệu cơ sở với một lần nhấp khác.

Cuối cùng, bạn có thể tùy chọn tải lên dữ liệu lược tả của mình lên trang web FiveRuns để phân tích và tư vấn về hiệu suất cộng đồng.

+3

Liên kết bị hỏng (DNS hết hạn). – mrzasa

39

Tôi đã chọn kỹ thuật này một lúc trở lại và thấy nó khá tiện dụng.

Khi thiết bị được đặt đúng chỗ, bạn có thể thêm ?profile=true vào bất kỳ URL nào truy cập bộ điều khiển. Hành động của bạn sẽ chạy như bình thường, nhưng thay vì cung cấp trang được hiển thị cho trình duyệt, nó sẽ gửi trang ruby-prof được định dạng chi tiết, được định dạng độc đáo thể hiện nơi hành động của bạn đã dành thời gian.

Đầu tiên, thêm ruby-prof để Gemfile của bạn, có lẽ trong nhóm phát triển:

group :development do 
    gem "ruby-prof" 
end 

Sau đó, thêm một around filter để ApplicationController của bạn:

around_filter :profile if Rails.env == 'development' 

def profile 
    if params[:profile] && result = RubyProf.profile { yield } 

    out = StringIO.new 
    RubyProf::GraphHtmlPrinter.new(result).print out, :min_percent => 0 
    self.response_body = out.string 

    else 
    yield 
    end 
end 

Reading đầu ra ruby-prof là một một chút nghệ thuật, nhưng tôi sẽ để nó như một bài tập.

lưu ý bổ sung bởi ScottJShea: Nếu bạn muốn thay đổi kiểu đo nơi này:

RubyProf.measure_mode = RubyProf::GC_TIME #example

Trước if trong phương pháp thông tin về bộ điều khiển ứng dụng. Bạn có thể tìm danh sách các số đo có sẵn tại ruby-prof page. Theo văn bản này, các luồng dữ liệu memoryallocations dường như bị hỏng (see defect).

+4

đối với bất cứ ai cun'n'pasting này, bạn cũng cần phải thêm "yêu cầu" ruby-prof "" ở trên cùng của ApplicationController của bạn. Ngoài ra, đối với tôi, tôi phải thay đổi "self.response_body =" thành "self.response.body =" (Rails 2.3.14) – Pavling

+0

Cảm ơn những chỉnh sửa đó. 'response_body' đã được thêm vào trong Rails 3.0. Và nếu bạn đang sử dụng bundler, bạn không cần phải yêu cầu ruby-prof, nhưng tôi rất vui vì kỹ thuật này khá thích nghi với phiên bản cũ của Rails. –

+0

Cảm ơn bạn đã đầu, Pavling. Tôi cũng đang sử dụng đường ray 2.3.14 và gặp sự cố khi làm việc này. Tôi nhận được "sai số đối số (0 cho 1)" trong graph_html_printer.rb: 98: trong 'full_name ', bất kể phiên bản ruby-prof tôi cài đặt là gì. Bất kỳ ý tưởng gì có thể gây ra điều đó? – jsarma

0

này hoạt động trong Rails 4.2.6:

o=OpenStruct.new(logger: Rails.logger) 
    o.extend ActiveSupport::Benchmarkable 
    o.benchmark 'name' do 
     # ... your code ... 
    end 
Các vấn đề liên quan