国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

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

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

2020-05-30 20:11:07
字體:
供稿:網(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)建后,對象進(jìn)入管道之前。所以后者的效率比-Filter 要低。盡管如此,使用-Include, 和 -Exclude后,讓部分對象不進(jìn)入管道,速度也是非常快的。

有時,應(yīng)當(dāng)使用更多的類型去過濾。比如你想搜索D盤下所有的后綴名為htm的文件。我們應(yīng)當(dāng)會使用*.htm作為過濾-Filter條件,PowerShell使用傳統(tǒng)的文件系統(tǒng)通配符,僅會返回所有匹配到的文件對象。這樣效率很高,因為這種簡單模式匹配,Windows API本身在底層就實現(xiàn)了。然而Windows API本身也有許多限制,因為它太老了,它會忽略文件后綴名中除了htm這三個字符以外的所有字符。所以即使有Html這樣后綴名它也會返回。所以此時,我們需要-filter和-include雙劍合璧,打敗金輪法王。
代碼如下:dir D: -Filter '*.htm' -Include '*.html' -Recurse
但是有一點要記住,使用-Filter過濾條件是很快,但是到底快到什么程度取決于-Filter調(diào)用的底層API。我們來舉個例子吧:
代碼如下:Get-WmiObject -Class Win32_Product  -Filter 'Vendor LIKE "%Microsoft%"'
這個例子會查詢機(jī)器安裝的所有微軟的產(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)對象:
代碼如下:Get-ChildItem -Path D:/ -Recurse | ForEach-Object { do-something }
使用了這個命令后,每一個文件對象經(jīng)過額外的包裝后,會經(jīng)過管道的邊界,代碼的執(zhí)行效率顯著下降,但是它不會占用太多內(nèi)存,因為每次只有一個對象在管道中流通。

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 惠州市| 潞城市| 沾益县| 兴义市| 远安县| 尼木县| 贵阳市| 平舆县| 衡东县| 大埔区| 安康市| 深水埗区| 威宁| 那曲县| 太仓市| 昌乐县| 鸡东县| 额济纳旗| 岳西县| 玉环县| 维西| 河曲县| 九寨沟县| 新平| 临朐县| 崇义县| 庐江县| 都昌县| 鄂州市| 新野县| 常宁市| 平乐县| 通山县| 凤城市| 易门县| 报价| 古丈县| 贡山| 贡山| 南溪县| 瓮安县|