優(yōu)化Ruby腳本效率實(shí)例分享
profile.rb是為Ruby程序準(zhǔn)備的profiler,它可以統(tǒng)計(jì)并輸出各方法的運(yùn)行時(shí)間,以便于找到程序執(zhí)行的性能瓶頸。這次就用它來(lái)剖析腳本的運(yùn)行時(shí)間。使用方法很簡(jiǎn)單,加上命令行選項(xiàng)-r profile就可以:
ruby -r profile rename.rb
運(yùn)行結(jié)束后,會(huì)把統(tǒng)計(jì)信息輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出中。如下圖所示:

profile統(tǒng)計(jì)的是各方法的運(yùn)行時(shí)間,分為2類。第1種計(jì)算的是從方法調(diào)用到方法返回之間的時(shí)間,稱為整體時(shí)間;第2種則是從整體時(shí)間中扣除在該方法中調(diào)用其它方法所耗費(fèi)時(shí)間之后得到的時(shí)間,稱為實(shí)際時(shí)間。輸出信息每行中各字段含義如下(從左到右):
該方法執(zhí)行時(shí)間占整體時(shí)間的百分比,比例越高越說(shuō)明這行代碼可能需要優(yōu)化
整體時(shí)間的總和
實(shí)際時(shí)間的總和
被調(diào)用的次數(shù)
每次調(diào)用的平均實(shí)際時(shí)間(毫秒)
每次調(diào)用的平均整體時(shí)間(毫秒)
方法名
由上圖可以看出,腳本執(zhí)行的時(shí)間大部分耗在了循環(huán)上。解決方法有兩個(gè):消除循環(huán)或減少循環(huán)次數(shù)。前者很難實(shí)現(xiàn),暫且還沒(méi)有想到辦法,也許根本就沒(méi)有可能。腳本中mapping的大小為2685,所以每修改一個(gè)文件名需要執(zhí)行2685次循環(huán),且循環(huán)中的encode和gsub!都是耗時(shí)操作。通常文件名的長(zhǎng)度不超過(guò)30個(gè)字符,通過(guò)遍歷文件名中每個(gè)字符的方式重命名就可以把循環(huán)次數(shù)縮減到不超過(guò)30次。
修改代碼后重新執(zhí)行分析命令,得到的結(jié)果是腳本運(yùn)行時(shí)間從379395秒優(yōu)化到2418秒,性能整整提升了156倍,達(dá)到2個(gè)數(shù)量級(jí)的效果。

相關(guān)文章
Ruby單元測(cè)試框架TestUnit的替代者M(jìn)iniTest介紹
這篇文章主要介紹了Ruby單元測(cè)試框架TestUnit的替代者M(jìn)iniTest介紹,本文先是對(duì)比了TestUnit、MiniTest的優(yōu)劣,然后給出了MiniTest的使用示例,需要的朋友可以參考下2015-03-03
win10下使用virtualbox + vagrant配置ruby開(kāi)發(fā)機(jī)環(huán)境
Vagrant是一個(gè)基于Ruby的工具,用于創(chuàng)建和部署虛擬化開(kāi)發(fā)環(huán)境。它 使用Oracle的開(kāi)源VirtualBox虛擬化系統(tǒng),使用 Chef創(chuàng)建自動(dòng)化虛擬環(huán)境。搭配Cmder如絲般順滑,實(shí)現(xiàn)你所有關(guān)于Mac&Linux的幻想2017-08-08
比較詳細(xì)的ruby symbol 學(xué)習(xí)資料
最近在學(xué)習(xí)ruby on rails,的確是一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)開(kāi)發(fā)框架。但在過(guò)程中,發(fā)現(xiàn)在視圖文件夾中的rhtml文件里有大量的類似于以下的語(yǔ)句2008-08-08
Ruby中XML格式數(shù)據(jù)處理庫(kù)REXML的使用方法指南
這篇文章主要介紹了Ruby中XML格式數(shù)據(jù)處理庫(kù)REXML的使用方法指南,值得注意的REXML庫(kù)處理XML字符串時(shí)的編碼問(wèn)題,是需要的朋友可以參考下2016-04-04

