[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
https://learn.microsoft.com/zh-c ... view=powershell-5.1
PowerShell脚本性能注意事项

如果认为MS官网资料也在说谎,那就没法了。

TOP

本帖最后由 WHY 于 2022-11-8 16:15 编辑

今天休息,对楼上几个脚本进行了一番性能测试。
1.测试环境
CPU:AMD A8-9600 3.10 GHz
内存:12.0 GB
硬盘:西数240G固态 + 西数1T机械
系统:Win10中文专业版 21H2 19044.2130
2.测试数据
下面脚本保存到 E:\Test\测试.bat,(E盘为机械硬盘)生成测试数据(3万个文件)
  1. @echo off
  2. for %%i in (Test1 Test2 Test3 Test4) do (
  3.     md %%i 2>nul
  4.     for %%j in (a b c d e f g h i j k l m n o p q r s t u v w x y z) do (
  5.         for %%k in (txt prt pro drw asm mfg frm sec) do (
  6.             for /L %%x in (1 11 400) do (
  7.                 echo;%%j.%%k.%%x > "%%i\%%j.%%k.%%x"
  8.             )
  9.         )
  10.     )
  11. )
  12. pause
复制代码
3.测试方法
a.关闭系统杀毒软件;
b.在E:\Test目录下,分别对6、7、11、13楼脚本进行测试;
c.每个脚本测试完成,记录相应测试结果;
d.重启;
e.循环步骤a~d对6、7、11、13楼进行操作。
4.测试结果
6楼,CPU占用平均27.1% 内存占用99.4MB  磁盘使用最高1.8MB 脚本运行时间50.7s
  1. @echo off
  2. echo %time%
  3. PowerShell -c "dir -Literal '%~dp0' -Recurse | ?{ $_ -is [IO.FileInfo] -and $_.Extension -match '^\.[1-9]\d*$' } | sort{ 1 * $_.Extension.Trim('.') } | group{ $_.FullName -replace '\.\d+$' } | forEach{ $n = $_.Count - 1; for($i=0;$i -lt $n;$i++){ del -Literal $_.Group[$i].FullName } mv -Literal $_.Group[$n].FullName -Dest ($_.Name + '.1') }"
  4. echo %time%
  5. pause
复制代码
7楼,CPU占用平均28.5% 内存占用10.6MB  磁盘使用最高2.5MB 脚本运行时间83.5s
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3.     echo !time!
  4.     for /f "tokens=1,3 delims=/" %%i in ('"%~f0" ARG ^| sort') do (
  5.         if /i "%%i" == "!f!" (
  6.             del "!f!!e!"
  7.         ) else if defined f (
  8.             for /f "delims=" %%k in ("!f!") do ren "!f!!e!" "%%~nxk.1"
  9.         )
  10.         set "f=%%i"
  11.         set "e=%%j"
  12.     )
  13.     if defined f (
  14.         for /f "delims=" %%k in ("!f!") do ren "!f!!e!" "%%~nxk.1"
  15.     )
  16.     echo !time!
  17.     pause & exit
  18. ) else (
  19.     for /f "delims=" %%i in ('dir /b /a-d /s ^| findstr "\.[1-9][0-9]*$"') do (
  20.         for /f "delims=." %%j in ("%%~xi") do set "s=0000000000%%j"
  21.         echo;%%~dpni/!s:~-10!/%%~xi
  22.     )
  23. )
复制代码
11楼,CPU占用平均22.6% 内存占用92.3MB  磁盘使用最高2.2MB 脚本运行时间139.1s
  1. @echo off
  2. echo %time%
  3. PowerShell "ls -Literal '%~dp0' -r|?{!$_.PsIsContainer -and $_.Extension -match '\.\d+$'}|sort @{e={ $_.Extension.Trim('.') -as [int]}}|%%{mv -Literal $_.FullName -dest ($_.DirectoryName+'\'+$_.BaseName+'.1') -Force;}"
  4. echo %time%
  5. pause
复制代码
13楼,CPU占用平均28.5% 内存占用103.4MB  磁盘使用最高2.8MB 脚本运行时间32.7s
  1. $t = get-Date;
  2. $path = $MyInvocation.MyCommand.Path -replace '\\[^\\]+$';  #当前脚本目录
  3. $hash = @{};
  4. $max  = @{};
  5. $files = dir -Literal $path -Recurse | ?{ $_ -is [IO.FileInfo] -and $_.Extension -match '^\.[1-9]\d*$' }
  6. $count = $files.Count;
  7. for( $i = 0; $i -lt $count; $i++ ){
  8.     $key = $files[$i].DirectoryName + '\' + $files[$i].BaseName;
  9.     $ext = 1 * $files[$i].Extension.Trim('.');
  10.     if( $hash[$key] -isNot [Collections.ArrayList] ){
  11.         $hash[$key] = [Collections.ArrayList]@();
  12.     }
  13.     [void]$hash[$key].Add( $files[$i].FullName );   #文件全名加入HashTable
  14.     if( $max[$key] -lt $ext ){ $max[$key] = $ext; } #最大版本号
  15. }
  16. forEach( $key In $hash.Keys ){
  17.     $maxFile = $key + '.' + $max[$key];             #最大版本号文件
  18.     if( $hash[$key].Count - 1 ){
  19.         $hash[$key].Remove( $maxFile );             #从数组移除
  20.         Remove-Item -Literal $hash[$key];   #删除文件
  21.     }
  22.     Move-Item -Literal $maxFile -Dest ( $key + '.1' );  #移动(改名)
  23. }
  24. ((get-Date) - $t).Totalseconds
  25. [Console]::ReadLine();
复制代码
有兴趣可以亲自试一下。
1

评分人数

    • idwma: 都受到了硬盘io的限制呀技术 + 1

TOP

返回列表