我想提高我的應用程序的性能,並開始閱讀http://guides.rubyonrails.org/performance_testing.html。我的問題在這個「我如何開始」的演講結束時。提高Rails 3應用程序的性能:最佳工作流程?
於是我開始簡單的用
class BrowsingTest < ActionDispatch::PerformanceTest
self.profile_options = { :runs => 5, :metrics => [:wall_time, :process_time],
:output => 'tmp/performance', :formats => [:flat] }
def test_homepage
get '/'
end
end
的
bundle exec rake test:profile
在終端輸出
BrowsingTest#test_homepage (909 ms warmup)
wall_time: 341 ms
process_time: 517 ms
和process_time平面文件,它開始像
Thread ID: 70299857145540
Total: 2.589931
%self total self wait child calls name
12.45 0.32 0.32 0.00 0.00 110 BasicObject#method_missing
10.59 0.28 0.27 0.00 0.01 415 Kernel#raise
7.79 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
不知道該怎麼做,我開始尋找一些使用method_missing的東西。我發現我用來轉換指標的一個庫(Alchemist)會這樣做,並將其自身包含在Numeric類中。
由於主頁並不真的需要,我只是刪除了該庫並重新運行了分析測試。 這一次我得到了以下
BrowsingTest#test_homepage (856 ms warmup)
wall_time: 321 ms
process_time: 482 ms
而平面文件沒有method_missing的再
Thread ID: 70185893711560
Total: 2.420023
%self total self wait child calls name
12.05 0.29 0.29 0.00 0.00 5 ActionView::Base#helpers
8.32 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
5.12 0.12 0.12 0.00 0.00 5925 String#gsub
我跑了第二次,獲得了
BrowsingTest#test_homepage (856 ms warmup)
wall_time: 321 ms
process_time: 482 ms
Thread ID: 70231460630220
Total: 2.411142
%self total self wait child calls name
14.18 1.49 0.34 0.00 1.16 3265 Array#each
8.26 0.20 0.20 0.00 0.00 1350 <Class::Dir>#[]
4.94 0.12 0.12 0.00 0.00 205 Kernel#caller
如此看來,不使用庫會節省約35ms的處理時間,這與平面文件所說的相似。我想我應該嘗試做些什麼,尤其是因爲它似乎經常被稱爲數字包含。
現在,這裏是我的問題:
- 是不是正確的做法?有沒有更好的方法開始?
- 什麼是要找準類/方法多數民衆贊成降低性能的最佳方式(對我下一步將尋找利用風向的東西,但有使用它的一個以上的地方)
- 什麼是可以接受的處理時間?
- 我跑了測試:配置文件連續幾次,「String#gsub」的自我時間從0.04變爲0.12。會發生什麼?
謝謝!