優(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類(lèi)。第1種計(jì)算的是從方法調(diào)用到方法返回之間的時(shí)間,稱(chēng)為整體時(shí)間;第2種則是從整體時(shí)間中扣除在該方法中調(diào)用其它方法所耗費(fèi)時(shí)間之后得到的時(shí)間,稱(chēng)為實(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)文章
編寫(xiě)Ruby腳本來(lái)對(duì)Twitter用戶(hù)的數(shù)據(jù)進(jìn)行深度挖掘
這篇文章主要介紹了編寫(xiě)Ruby腳本來(lái)對(duì)Twitter用戶(hù)的數(shù)據(jù)進(jìn)行深度挖掘的一些例子,通過(guò)調(diào)用Twitter API來(lái)實(shí)現(xiàn)各種功能(內(nèi)地注意墻),需要的朋友可以參考下2015-11-11Ruby中實(shí)現(xiàn)把字符串轉(zhuǎn)換為類(lèi)的2種方法
這篇文章主要介紹了Ruby中實(shí)現(xiàn)把字符串轉(zhuǎn)換為類(lèi)的2種方法,其中一種是rails提供的方法,需要的朋友可以參考下2014-10-10Ruby on Rails網(wǎng)站項(xiàng)目構(gòu)建簡(jiǎn)單指南
Rails項(xiàng)目通過(guò)Ruby世界中的gem和rake工具來(lái)構(gòu)建起來(lái)真的相當(dāng)方便,這里就給大家整理了一份Ruby on Rails網(wǎng)站項(xiàng)目構(gòu)建簡(jiǎn)單指南,需要的朋友可以參考下2016-06-06Ruby編寫(xiě)HTML腳本替換小程序的實(shí)例分享
這篇文章主要介紹了Ruby編寫(xiě)HTML腳本替換小程序的實(shí)例分享,單純使用Ruby中的字符串替換方法而沒(méi)有涉及更復(fù)雜的正則表達(dá)式,需要的朋友可以參考下2016-05-05ruby實(shí)現(xiàn)github第三方認(rèn)證
GitHub在用戶(hù)認(rèn)證過(guò)程中采用了雙匙機(jī)制,在雙匙加密機(jī)制中,只有合法用戶(hù)才擁有私匙,只要GitHub在收到請(qǐng)求時(shí)可以證明提交請(qǐng)求的客戶(hù)端上擁有該私匙,即可以確認(rèn)該操作是由合法用戶(hù)發(fā)起的。我們通過(guò)ruby來(lái)簡(jiǎn)單模擬下吧。2015-06-06