淺析Ruby中的Profiling工具的用法
內(nèi)置的profiler實(shí)現(xiàn)的很簡(jiǎn)單,在ruby2.2中只有150行代碼,大家可以看看它的實(shí)現(xiàn)profile.rb 。內(nèi)置的profiler使用起來非常的方便,只需要加上-rprofile參數(shù)即可。例如:
執(zhí)行:
ruby -rprofile test.rb
輸出結(jié)果為:
通過打印出的結(jié)果能夠很明顯的看出耗時(shí)的方法。內(nèi)置的profiler很簡(jiǎn)單,只能打印出這樣的結(jié)果,沒有 其他輸出格式的選項(xiàng),下面介紹的其他幾種都有豐富的格式輸出。
ruby-prof
repo: https://github.com/ruby-prof/ruby-prof
ruby-prof具有C擴(kuò)展,所以它能運(yùn)行的更快,同時(shí)它支持豐富的輸出格式,方便我們?nèi)ゲ檎倚阅芷款i。 ruby-prof支持輸出GraphViz支持的dot格式,兩者的安裝方法如下:
gem install ruby-prof ubuntu | sudo apt-get install graphviz Mac | brew install graphviz
執(zhí)行命令很簡(jiǎn)單,如下:
ruby-prof --mode=wall --printer=dot --file=output.dot test.rb 25
此命令的詳細(xì)使用方法請(qǐng)參考幫助信息ruby-prof --help。
上面命令的執(zhí)行結(jié)果會(huì)輸出一個(gè)graphviz的dot文件,graphviz提供一個(gè)格式轉(zhuǎn)換命令,可以將此文件 轉(zhuǎn)換為一個(gè)pdf文件以方便查看,如下:
dot -T pdf -o output.pdf output.dot
這樣就可以打開output.pdf查看程序內(nèi)的方法調(diào)用占比了。
perftools.rb
repo: https://github.com/tmm1/perftools.rb
perftools.rb是google-perftools的ruby版本,不過它只支持ruby2.1以下版本,2.1及以上 版本就需要用到下面的stackprof了,這兩個(gè)工具都是一個(gè)人寫的。鑒于此,我們略過perftools.rb, 作者實(shí)現(xiàn)stackprof,就是為了替代perftools.rb。如果有需求的話,就請(qǐng)參考其github主頁(yè)。
stackprof
repo: https://github.com/tmm1/stackprof
stackprof只支持Ruby2.1+,不過現(xiàn)在ruby的版本發(fā)布很快,每一個(gè)版本都能帶來一些新東西,2.1 應(yīng)該很快就能成為很基礎(chǔ)的版本,我們就在這個(gè)版本上來做一些測(cè)試。
安裝:
gem install stackprof
這次我們直接在代碼中使用stackprof的方法:
require 'stackprof' def m1 5_000_000.times{ 1+2+3+4+5 } end def m2 1_000_000.times{ 1+2+3+4+5 } end StackProf.run(mode: :cpu, out: 'tmp/stackprof.dump') do m1 m2 end
我們執(zhí)行這個(gè)ruby程序,ruby test.rb,會(huì)在當(dāng)前目錄的tmp目錄中產(chǎn)生一個(gè)文件stackprof.dump, 然后來分析以下這個(gè)文件,stackprof命令本身可以解析這個(gè)文件,執(zhí)行下面的命令:
stackprof tmp/stackprof.dump --text
則會(huì)產(chǎn)生下面的結(jié)果,結(jié)果應(yīng)該是很清晰的,很明顯在代碼中m1方法要占有絕大部分的運(yùn)行時(shí)間。
================================== Mode: cpu(1000) Samples: 75 (0.00% miss rate) GC: 0 (0.00%) ================================== TOTAL (pct) SAMPLES (pct) FRAME 62 (82.7%) 62 (82.7%) block in Object#m1 13 (17.3%) 13 (17.3%) block in Object#m2 75 (100.0%) 0 (0.0%) <main> 75 (100.0%) 0 (0.0%) block in <main> 75 (100.0%) 0 (0.0%) <main> 62 (82.7%) 0 (0.0%) Object#m1 13 (17.3%) 0 (0.0%) Object#m2
其他更加豐富的輸出方式和分析方式,就請(qǐng)參考stackprof的github主頁(yè),講解的很全面。
如果你希望在web前端中展示相關(guān)信息,就請(qǐng)看看stackprof-webnav這個(gè)gem,它提供了比較全面的 展示,操作等等,適合在一些web應(yīng)用中使用,github地址:stackprof-webnav
rack-mini-profiler
repo: https://github.com/MiniProfiler/rack-mini-profiler
rack-mini-profiler專門應(yīng)用于基于rack的web應(yīng)用的性能調(diào)優(yōu),在rails中的使用方法如下:
首先將gem添加到gemfile中:
gem 'rack-mini-profiler'
執(zhí)行:
bundle install
然后重啟你的服務(wù)器,訪問任意的URl,在頁(yè)面上的左上角會(huì)看到響應(yīng)時(shí)間的毫秒數(shù)。如下圖所示:
點(diǎn)擊query time(ms)列中的1 sql則可以查看到執(zhí)行的sql語(yǔ)句及耗時(shí):
相關(guān)文章
詳解Ruby on Rails中的mailer相關(guān)使用
這篇文章主要介紹了詳解Ruby on Rails中的mailer相關(guān)使用,主要針對(duì)其相關(guān)的編程風(fēng)格給出建議,需要的朋友可以參考下2015-08-08mac os gem安裝json出現(xiàn)error failed的解決辦法
這篇文章主要介紹了mac os gem安裝json出現(xiàn)error failed的解決辦法,系統(tǒng)是mac os Mavericks,失敗提示Failed to build gem native extension,需要的朋友可以參考下2014-06-06比較詳細(xì)的ruby symbol 學(xué)習(xí)資料
最近在學(xué)習(xí)ruby on rails,的確是一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)開發(fā)框架。但在過程中,發(fā)現(xiàn)在視圖文件夾中的rhtml文件里有大量的類似于以下的語(yǔ)句2008-08-08以MVC的思維方式來理解Ruby on Rails框架的設(shè)計(jì)結(jié)構(gòu)
Ruby on Rails是Ruby世界中Web開發(fā)框架的代名詞,人氣相當(dāng)之高,本文就帶大家以MVC的思維方式來理解Ruby on Rails框架的設(shè)計(jì)結(jié)構(gòu),需要的朋友可以參考下2016-05-05Ruby創(chuàng)建“關(guān)鍵字”同名方法別名的方法
這篇文章主要介紹了Ruby創(chuàng)建“關(guān)鍵字”同名方法別名的方法,本文提示的是一個(gè)小技巧,特殊場(chǎng)景時(shí)可能會(huì)用到,需要的朋友可以參考下2015-01-01Ruby實(shí)現(xiàn)批量對(duì)文件增加前綴代碼分享
這篇文章主要介紹了Ruby實(shí)現(xiàn)批量對(duì)文件增加前綴代碼分享,本文給出實(shí)現(xiàn)代碼、使用方法、使用示例等內(nèi)容,需要的朋友可以參考下2015-01-01Ruby中require、load、include、extend的區(qū)別介紹
這篇文章主要介紹了Ruby中require、load、include、extend的區(qū)別介紹,require、load用于文件,如.rb等等結(jié)尾的文件,include、load則用于包含一個(gè)文件中的模塊,需要的朋友可以參考下2015-05-05