麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > PowerShell > 正文

PowerShell腳本性能優(yōu)化技巧總結(jié)

2020-03-26 19:24:40
字體:
供稿:網(wǎng)友

最終優(yōu)化

在你寫腳本時,不要老是想著去優(yōu)化,因為你的部分優(yōu)化代碼可能最終被丟棄。而且老是想著優(yōu)化也會降低你的生產(chǎn)效率,因為和CPU的時間相比,腳本編寫者的時間可能會更寶貴。

使用過濾參數(shù)

PowerShell可能會消耗很多資源,因為許多Cmdlet本身的設(shè)計就是用來提供數(shù)目很大的數(shù)據(jù)。所以,如果你使用的Cmdlet命令支持-Filter, -Include, 和 -Exclude這樣的過濾條件,就盡量使用它們。

首先如果一條命令支持-Filter 過濾器參數(shù),那就說明這里可能隱藏著一個對象訪問API。使用過濾,可能會讓代碼執(zhí)行得非???,因為通常會在對象被創(chuàng)建之前就執(zhí)行過濾。相反一條命令支持-Include, 和 -Exclude,這樣的過濾會發(fā)生在對象被創(chuàng)建后,對象進入管道之前。所以后者的效率比-Filter 要低。盡管如此,使用-Include, 和 -Exclude后,讓部分對象不進入管道,速度也是非常快的。

有時,應(yīng)當使用更多的類型去過濾。比如你想搜索D盤下所有的后綴名為htm的文件。我們應(yīng)當會使用*.htm作為過濾-Filter條件,PowerShell使用傳統(tǒng)的文件系統(tǒng)通配符,僅會返回所有匹配到的文件對象。這樣效率很高,因為這種簡單模式匹配,Windows API本身在底層就實現(xiàn)了。然而Windows API本身也有許多限制,因為它太老了,它會忽略文件后綴名中除了htm這三個字符以外的所有字符。所以即使有Html這樣后綴名它也會返回。所以此時,我們需要-filter和-include雙劍合璧,打敗金輪法王。

復(fù)制代碼 代碼如下:
dir D: -Filter '*.htm' -Include '*.html' -Recurse

但是有一點要記住,使用-Filter過濾條件是很快,但是到底快到什么程度取決于-Filter調(diào)用的底層API。我們來舉個例子吧:
復(fù)制代碼 代碼如下:
Get-WmiObject -Class Win32_Product  -Filter 'Vendor LIKE "%Microsoft%"'

這個例子會查詢機器安裝的所有微軟的產(chǎn)品,縱然我們使用了-filter,仍舊很慢?因為-Filter調(diào)用的是Windows Management Instrumentation (WMI)API,這個是基于WMI查詢語言(WQL)的,過濾是發(fā)生在WMI內(nèi)部的。

 

減少資源的占用

性能的優(yōu)化包括降低時間復(fù)雜度和空間復(fù)雜度,但是很多時候,魚和熊掌不可兼得。你只能選擇其一。舉個例子吧:比如你想列出D盤下所有的文件,然后針對每個文件做點事情,你可能會使用ForEach-object來變量整個集合中的文件系統(tǒng)對象:

復(fù)制代碼 代碼如下:
Get-ChildItem -Path D:/ -Recurse | ForEach-Object { do-something }

使用了這個命令后,每一個文件對象經(jīng)過額外的包裝后,會經(jīng)過管道的邊界,代碼的執(zhí)行效率顯著下降,但是它不會占用太多內(nèi)存,因為每次只有一個對象在管道中流通。

 

另外一種方法,你可能會使用Foreach循環(huán):

 

復(fù)制代碼 代碼如下:
foreach($file in (Get-ChildItem -Path D:/ -Recurse)){
 do-something }

這段代碼執(zhí)行起來非???,因為它避免了管道邊界。但是它在處理之前會把所有文件對象加入到集合中。所以如果這個集合非常龐大,它可能會像某國的某能源局領(lǐng)導占用上億人民幣一樣,洪水禽獸般占用系統(tǒng)資源。

 

Foreach循環(huán)比ForEach-Object,執(zhí)行速度快,消耗的內(nèi)存多。但是如果你能確定你要處理的數(shù)據(jù)規(guī)模不是很大,F(xiàn)oreach循環(huán)當然是上上之選。

使用Sleep降低CPU的使用率

接觸很多對象的PowerShell腳本,通常會執(zhí)行很長時間,對于處理器也不會憐香惜玉。現(xiàn)在單核CPU已成往事,在多核的今天這可能不是個事,但這仍舊可能會導致系統(tǒng)花費了大量時間去等待。如果你的腳本消耗了很多CPU周期,或者需要等待事情發(fā)生,你可以使用Start-Sleep這條命令來降低處理器的使用率。默認Slee是按秒來等待的,這肯定受不了,你可以設(shè)置一個毫秒級別的暫停。始終的分辨率不超過10到20毫秒會更好(再小就沒有意義了),所以你可以指定最小暫停時間為20毫秒。

另外你可能不想讓你的腳本每個循環(huán)周期中都Sleep,只讓部分周期Sleep,以給CPU騰出時間去做其它事。下面的腳本會借助操作符%取模來保證每10輪暫停一次:

復(fù)制代碼 代碼如下:
$i=0
Get-ChildItem -Recurse |
 ForEach-Object{    $i+=1
    if($i%10 –eq 0)
   {sleep -mill 20}
   do-something
}

 

簡單的優(yōu)化方案

你可以把這些小技巧歸納成一個統(tǒng)一的優(yōu)化方案。首先,別急著優(yōu)化直到腳本寫完了。接著,使用Filter過濾來減少限制返回對象的數(shù)目,然后再用-include和,-exclude進行微調(diào),這樣做既會減少運行時間,也會降低資源的使用率?;谶@一點,如果你的數(shù)據(jù)量比較大,就使用Foreach循環(huán)來代替Foreach-Object,這樣會讓你的腳本執(zhí)行效率提高。當然如果你的數(shù)據(jù)規(guī)模到了10萬級以上,這可能會引入新的性能問題。最后,如果你發(fā)現(xiàn)自己的腳本CPU占用率老高老高,看看能否在一些循環(huán)中使用Start-Sleep命令,來放松一下。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美一级特黄aaaaaa在线看首页 | 色中色在线播放 | 黄色网址进入 | 一级电影免费看 | 欧美1—12sexvideos| 成人一区二区在线观看视频 | 国产午夜精品久久久久久免费视 | 狠狠操精品视频 | 久久精品视频网址 | 久久人人爽人人爽人人片av高请 | 国产精品视频一区二区三区四 | 素人视频在线观看免费 | 香蕉成人在线视频 | 国产一区二区三区四区五区在线 | 午夜生活理论片 | 欧美精品亚洲人成在线观看 | 久久精品国产99久久6动漫亮点 | 午夜精品一区二区三区免费 | 免费观看亚洲视频 | 欧美特级一级毛片 | 成年人网站视频免费 | 日本一区二区久久久 | 成人18网站 | 免费网站看v片在线a | av在线免费观看中文字幕 | 麻豆视频免费网站 | 国产精品久久久麻豆 | 国产一级aaa全黄毛片 | 一夜新娘第三季免费观看 | av中文在线观看 | 毛片在线免费 | 亚洲性在线视频 | 91精品国产乱码久久久久 | 成人在线视频播放 | 午夜视频在线 | 我爱我色成人网 | 成人一级毛片 | 亚洲极色| 国产毛片毛片毛片 | 密室逃脱第一季免费观看完整在线 | 日韩视频区 |