濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > PowerShell腳本性能優(yōu)化技巧總結(jié)

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

熱門標(biāo)簽:合肥電銷外呼系統(tǒng)供應(yīng)商 電話機(jī)器人對(duì)家居行業(yè)幫助大嗎 蘭州電銷機(jī)器人加盟 黑暗之魂3地圖標(biāo)注 沈陽(yáng)ai電銷智能機(jī)器人 電商外呼系統(tǒng)排名 如何申請(qǐng)400的電話呀 地圖標(biāo)注審核周期 AI智能電銷機(jī)器人壞處

最終優(yōu)化

在你寫腳本時(shí),不要老是想著去優(yōu)化,因?yàn)槟愕牟糠謨?yōu)化代碼可能最終被丟棄。而且老是想著優(yōu)化也會(huì)降低你的生產(chǎn)效率,因?yàn)楹虲PU的時(shí)間相比,腳本編寫者的時(shí)間可能會(huì)更寶貴。

使用過(guò)濾參數(shù)

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

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

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

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

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

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

減少資源的占用

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

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

使用了這個(gè)命令后,每一個(gè)文件對(duì)象經(jīng)過(guò)額外的包裝后,會(huì)經(jīng)過(guò)管道的邊界,代碼的執(zhí)行效率顯著下降,但是它不會(huì)占用太多內(nèi)存,因?yàn)槊看沃挥幸粋€(gè)對(duì)象在管道中流通。

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

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

這段代碼執(zhí)行起來(lái)非??欤?yàn)樗苊饬斯艿肋吔?。但是它在處理之前?huì)把所有文件對(duì)象加入到集合中。所以如果這個(gè)集合非常龐大,它可能會(huì)像某國(guó)的某能源局領(lǐng)導(dǎo)占用上億人民幣一樣,洪水禽獸般占用系統(tǒng)資源。

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

使用Sleep降低CPU的使用率

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

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

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

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

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

您可能感興趣的文章:
  • PowerShell腳本監(jiān)控文件夾變化實(shí)例
  • python通過(guò)ssh-powershell監(jiān)控windows的方法
  • 如何利用PowerShell監(jiān)控Win-Server性能詳解

標(biāo)簽:淮南 河北 隴南 通遼 常州 河池 黔南 黔南

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PowerShell腳本性能優(yōu)化技巧總結(jié)》,本文關(guān)鍵詞  PowerShell,腳本,性能,優(yōu)化,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PowerShell腳本性能優(yōu)化技巧總結(jié)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于PowerShell腳本性能優(yōu)化技巧總結(jié)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    北海市| 宜君县| 桓台县| 新津县| 三亚市| 新乡市| 太仆寺旗| 神池县| 黄陵县| 广饶县| 徐闻县| 许昌市| 女性| 桐梓县| 兴业县| 长泰县| 长顺县| 内黄县| 舟曲县| 宁远县| 隆德县| 商南县| 天津市| 长岭县| 和林格尔县| 弥勒县| 葵青区| 景泰县| 黄龙县| 错那县| 十堰市| 偃师市| 牙克石市| 稷山县| 赤峰市| 宝鸡市| 蕉岭县| 广灵县| 仙桃市| 扎赉特旗| 遂川县|