簡述PowerShell腳本優(yōu)化技巧 |
| 發(fā)布時間: 2012/7/12 9:23:35 |
|
PowerShell腳本很有用,但有的卻消耗大量的內(nèi)存,或者需要很長的執(zhí)行時間。下面是關(guān)于如何提高此類腳本性能的一些技巧。
最后優(yōu)化 不要試圖在你寫代碼的時候優(yōu)化PowerShell腳本。你對代碼的優(yōu)化或許并不明顯,或許對最終的性能影響甚微。腳本編寫者的時間比起CPU周期更為寶貴。 使用篩選參數(shù) PowerShell會消耗大量的資源,因?yàn)樵S多cmdlet被設(shè)計(jì)成處理巨大的數(shù)據(jù)量。所以,如果你在使用一個有篩選參數(shù)(-Filter,-Include,或-Exclude)的cmdlet,那就首先使用它。 如果一個cmdlet支持參數(shù)-Filter,你要使用它。它對一個對象使用底層API,這意味著代碼執(zhí)行非?,因?yàn)楹Y選器在cmdlet創(chuàng)建對象之前應(yīng)用。參數(shù)-Include和-Exclude在cmdlet創(chuàng)建對象之后但對象尚未進(jìn)入PowerShell管道之前應(yīng)用到對象。因此,它們比-Filter慢,但是他們依然比對象已經(jīng)進(jìn)入到PowerShell管道之后進(jìn)行篩選要快。 有時候你會使用不止一種類型的篩選器。例如,假設(shè)你正搜索D盤所有以.htm為文件擴(kuò)展名的文件。參數(shù)-Filter使用傳統(tǒng)的Windows文件系統(tǒng)語義,.htm返回所有以.htm為擴(kuò)展名的文件。Windows API實(shí)現(xiàn)這種過濾,這使它非常快。然而,這是傳統(tǒng)API的一個極大限制。它們很陳舊,因此會忽略文件擴(kuò)展名中除了前三個字符以外的其他字符。例如,一個僅僅以-Filter對*.htm的篩選將只返回.htm文件。因此,對于快速篩選,你需要使用-Filter(在裝載前削減大量文件)和-Include(只獲取.htm文件)。下面是代碼樣例:
然而,請記住,-Filter使用底層API,因此它工作的速度依賴于這些API。舉個例子:
在這種情況下,參數(shù)-Filter運(yùn)行較慢,因?yàn)镚et-WmiObject cmdlet使用Windows管理規(guī)范(WMI)腳本API。而這也慢是因?yàn)閃MI使用WMI查詢語言(WQL)進(jìn)行篩選,這就是篩選與WMI的關(guān)系。 減少資源占用 性能優(yōu)化是降低資源占用以及減少可執(zhí)行時間。有時,你可以兩者兼具。另外一些時候,你必須作出選擇。例如,假設(shè)你需要列出D盤的文件并對每個文件操作。你可以使用ForEach-Object cmdlet遍歷集合中的文件系統(tǒng)對象,如下:
其中{…}表示代碼將對每個文件執(zhí)行。當(dāng)你使用這個cmdlet,在穿越管道界限時每個對象都要經(jīng)過額外的封裝操作,這顯著地降低了代碼的效率。但是它并不消耗太多的內(nèi)存,因?yàn)槊看瓮瑫r只有一個項(xiàng)目通過管道。 或者,你可以使用foreach迭代循環(huán),如以下代碼所示:
其中{…}表示代碼將對每個文件執(zhí)行。這個循環(huán)花費(fèi)了較少的運(yùn)行時間,因?yàn)樗苊饬斯艿澜缦蕖2贿^,它在處理所有的文件系統(tǒng)對象之前首先進(jìn)行收集,因此如果收集的數(shù)量很大的話它會消耗過多的系統(tǒng)資源。 Foreach循環(huán)更快但卻比ForEach-Object cmdlet使用更多的內(nèi)存。因此,如果你不希望有大的數(shù)據(jù)集foreach循環(huán)通常是一個更好的選擇。 以睡眠扼制CPU 觸及很多對象的PowerShell代碼經(jīng)常需要很長的執(zhí)行時間,并且不太容易釋放占用的處理器時間。比起在單核CPU時代,這已經(jīng)少了很多麻煩,但是這依然會導(dǎo)致系統(tǒng)為一個任務(wù)長時間等待。如果你的代碼消耗了大量的CPU周期,或需要長時間的等待,通常會使用Start-Sleep cmdlet來釋放處理器。默認(rèn)情況下,Start-Sleep操作在數(shù)秒之內(nèi),但你可以以毫秒為單位指定暫停時間。時鐘的分辨率通常不超過10到20毫秒的范圍,所以你可能想指定的最短休眠時間是20毫秒。此外,你不需要在每個循環(huán)中運(yùn)行一個睡眠周期;只需每隔幾個周期進(jìn)行釋放就足以保證當(dāng)前CPU對其他工作也是可用的。下面是一個使用Start-Sleep和取余操作符(%)每10個項(xiàng)目釋放一次處理器的周期:
一個基本的優(yōu)化計(jì)劃 你可以把這些技巧組合成一個基本的腳本優(yōu)化計(jì)劃。首先,不必?fù)?dān)心優(yōu)化問題直到腳本完成。其次,如果可能,使用-Filter約束你的腳本讀取項(xiàng)目的數(shù)量,并使用-Include和-Exclude做進(jìn)一步調(diào)整。這應(yīng)該同時減少運(yùn)行時間和資源占用。在這一點(diǎn)上,如果你依然有大數(shù)量的項(xiàng)目,考慮使用foreach循環(huán)替代ForEach-Object管道元素,從而加速腳本運(yùn)行。請記住,如果你正在查看成千上萬的對象,這可能會引發(fā)其他性能問題。最后,如果你的腳本有過多的CPU消耗,你可以在循環(huán)核心中使用Start-Sleep來觀察執(zhí)行效果。 本文出自:億恩科技【m.jfb888.cn】 服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM] |
京公網(wǎng)安備41019702002023號