優(yōu)化Ruby腳本效率實(shí)例分享
profile.rb是為Ruby程序準(zhǔn)備的profiler,它可以統(tǒng)計(jì)并輸出各方法的運(yùn)行時(shí)間,以便于找到程序執(zhí)行的性能瓶頸。這次就用它來剖析腳本的運(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í)間的百分比,比例越高越說明這行代碼可能需要優(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),暫且還沒有想到辦法,也許根本就沒有可能。腳本中mapping的大小為2685,所以每修改一個(gè)文件名需要執(zhí)行2685次循環(huán),且循環(huán)中的encode和gsub!都是耗時(shí)操作。通常文件名的長(zhǎng)度不超過30個(gè)字符,通過遍歷文件名中每個(gè)字符的方式重命名就可以把循環(huán)次數(shù)縮減到不超過30次。
修改代碼后重新執(zhí)行分析命令,得到的結(jié)果是腳本運(yùn)行時(shí)間從379395秒優(yōu)化到2418秒,性能整整提升了156倍,達(dá)到2個(gè)數(shù)量級(jí)的效果。
相關(guān)文章
編寫Ruby腳本來對(duì)Twitter用戶的數(shù)據(jù)進(jìn)行深度挖掘
這篇文章主要介紹了編寫Ruby腳本來對(duì)Twitter用戶的數(shù)據(jù)進(jìn)行深度挖掘的一些例子,通過調(diào)用Twitter API來實(shí)現(xiàn)各種功能(內(nèi)地注意墻),需要的朋友可以參考下2015-11-11Ruby中實(shí)現(xiàn)把字符串轉(zhuǎn)換為類的2種方法
這篇文章主要介紹了Ruby中實(shí)現(xiàn)把字符串轉(zhuǎn)換為類的2種方法,其中一種是rails提供的方法,需要的朋友可以參考下2014-10-10Ruby on Rails網(wǎng)站項(xiàng)目構(gòu)建簡(jiǎn)單指南
Rails項(xiàng)目通過Ruby世界中的gem和rake工具來構(gòu)建起來真的相當(dāng)方便,這里就給大家整理了一份Ruby on Rails網(wǎng)站項(xiàng)目構(gòu)建簡(jiǎn)單指南,需要的朋友可以參考下2016-06-06ruby實(shí)現(xiàn)github第三方認(rèn)證
GitHub在用戶認(rèn)證過程中采用了雙匙機(jī)制,在雙匙加密機(jī)制中,只有合法用戶才擁有私匙,只要GitHub在收到請(qǐng)求時(shí)可以證明提交請(qǐng)求的客戶端上擁有該私匙,即可以確認(rèn)該操作是由合法用戶發(fā)起的。我們通過ruby來簡(jiǎn)單模擬下吧。2015-06-06