[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已更新]cmd指令执行效率简易测试工具

本帖最后由 plp626 于 2011-6-16 19:04 编辑
  1. @ECHO off
  2. :: cmd 命令执行效率测试,保存为cff.bat于windows目录下,
  3. :: 命令行调用格式:cff 1000 "命令名" "命令名" ...
  4. :: 举例:
  5. ::         cff 300 "chcp >nul"
  6. ::         cff 10000 "set var=123" "set var=^!random^!" "shift"
  7. ::         cff 10000 "for /f %a in ("abcdef")do set str=%a"
  8. :: Version: 1.01; Code by plp; Thanks to: fastslz, batchar
  9. setlocal EnableDelayedExpansion
  10. set/a $lp=%1 2>nul||(
  11.     echo  Parameter %%1 --- %1
  12.     echo     is invalid number.&exit/b2
  13. )
  14. if %2.==. echo Paramter %%2 is missing.&exit/b3
  15. call:getinf&rem :: 获取版本信息和CPU信息
  16. :begin
  17. set "cmd=%~2"
  18. Set $time1=%time%
  19. for /l %%@ in (1 1 %$lp%)do %~2
  20. Set $time2=%time%
  21. call:etime $time1 $time2 $t12
  22. if !$t12!==0 echo Parameter %%1 --- %$lp%&echo    is too small.&exit/b4
  23. set/a $cff=$lp*100/$t12,$r=$lp*100%%$t12*10/$t12
  24. echo === [!$time1! --^> !$time2!=!$t12!] ===
  25. ECHO "!cmd!" : !$cff!.!$r! (Hz)
  26. if !$t12! leq 20 (
  27.    echo.&echo ^^! Paramter %%1 --- %$lp%
  28.    echo    is smallish and maybe the result "!$cff!.!$r!" is not accurate
  29.    exit/b5
  30. )
  31. if %3. neq . shift&goto:begin
  32. goto:eof
  33. :etime <beginTime_VarName> <endTime_VarName> <retVar>
  34. Set/a "%3=(!%2:~,2!-!%1:~,2!)*360000+(1!%2:~3,2!-1!%1:~3,2!)*6000+1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-8640000*(%3>>31)"&goto:eof
  35. :getinf
  36. ver&wmic cpu get name|find "CPU"
  37. set NUMBER_OF_PROCESSORS
复制代码

  1. Microsoft Windows XP [版本 5.1.2600]
  2. Genuine Intel(R) CPU           T1600  @ 1.66GHz
  3. NUMBER_OF_PROCESSORS=2
  4. "rem" : 366678.1 (Hz)
  5. "shift" : 139301.5 (Hz)
  6. "if a==b 命令" : 145857.1 (Hz)
  7. "@echo off" : 116761.1 (Hz)
  8. "break" : 107383.2 (Hz)
  9. "popd" : 108809.0 (Hz)
  10. "set a=1" : 70921.9 (Hz)
复制代码
结论:
  1. rem >>  if a==b 命令 >> shift >> @echo off >> break >> set a=1
复制代码

TOP

4# fastslz


也许是因为cmd,cscript,wscript这些脚本解释器都是单线程程序,使用内部命令时,始终是一个线程运行。
如果开多个cmd进程,就相当于多个线程,在多核系统中,系统根据任务调度的基本单位--线程,很可能根据情况分多个cpu。

(仅是猜测,勉强可以解释现象。)

TOP

每秒运算圆周率位数这个不能说明问题,计算圆周率的算法太多,没有个统一参考;
我倒是有个想法,测试cmd的echo off指令执行频率,容易统一比较;

还有一楼的代码太繁琐了,不知不觉都40行了,准备写个精简版的,可以根据是否为外部命令智能给出合适的循环次数,不用人为指定循环次数;

TOP

本帖最后由 plp626 于 2011-6-17 21:36 编辑

这个无需给定命令循环次数,由程序指定。
  1. :: cff "命令名"; "命令名"; ...
  2. :: 举例:
  3. ::         cff "set var=^!random^!"
  4. ::         cff "call set a=1"; "call set/a a=1"; "set/a a=1"
  5. ::         cff "for /f %a in ("abcdef")do set str=%a"
复制代码
  1. :: cmd 命令执行效率测试,保存为cff.bat于windows目录下,
  2. :: 命令行调用格式:
  3. ::                 cff "命令名"; "命令名"; ...
  4. :: Version: 1.1; Code by plp; Thanks to: fastslz, batchar
  5. @ECHO off&setlocal EnableDelayedExpansion&call:getinf
  6. echo ------------ CMD指令测试 -------------
  7. :beg
  8. set/a $lp=random%%5+1&set "cmd=%~1"
  9. :begin
  10. Set $time1=%time%
  11. for /l %%@ in (1 1 %$lp%)do %cmd%
  12. Set $time2=%time%
  13. call:etime $time1 $time2 $t12
  14. if !$t12! leq 20 set/a $lp=$lp*2+5&goto:begin
  15. set/a $cff=$lp*100/$t12,$r=$lp*100%%$t12*10/$t12
  16. call:print
  17. if %2. neq . shift&goto:beg
  18. goto:eof
  19. :etime <beginTime_VarName> <endTime_VarName> <retVar>
  20. Set/a "%3=(!%2:~,2!-!%1:~,2!)*360000+(1!%2:~3,2!-1!%1:~3,2!)*6000+1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-8640000*(%3>>31)"&goto:eof
  21. :getinf 获取版本信息和CPU信息
  22. ver&wmic cpu get name|find "CPU"
  23. set NUMBER_OF_PROCESSORS&goto:eof
  24. :print 格式化输出
  25. set "prt="!cmd!"                                  "
  26. set $cf=      !$cff!.!$r!&set $cf=!$cf:~-8! Hz
  27. if !cmd:~37!. neq . (echo "!cmd!" @ !$cf!)else (
  28.     echo !prt:~0,37! @ !$cf!
  29. )
复制代码

TOP

本帖最后由 plp626 于 2011-6-17 23:55 编辑

8楼的代码(version 1.1版本)win7下报错,具体原因下次公布答案,现在还在思考;

这次升级到1.11版,win7兼容版:
  1. :: cmd 命令执行效率测试,保存为cff.bat于windows目录下,
  2. :: 命令行调用格式:
  3. ::                 cff "命令名"; "命令名"; ...
  4. :: Version: 1.11; Code by plp; Thanks to: fastslz, batchar
  5. @ECHO off&setlocal EnableDelayedExpansion&call:getinf
  6. echo ------------ CMD指令测试 -------------
  7. :beg
  8. if "%~1"=="" goto:eof
  9. :: 比较纳闷的这句,在win7下改为 if %1.==. goto:eof 会出错!!
  10. set/a $lp=random%%5+1&set "cmd=%~1"
  11. :begin
  12. Set $time1=%time%
  13. for /l %%@ in (1 1 %$lp%)do %cmd%
  14. Set $time2=%time%
  15. call:etime $time1 $time2 $t12
  16. if !$t12! leq 20 set/a $lp=$lp*2+5&goto:begin
  17. set/a $cff=$lp*100/$t12,$r=$lp*100%%$t12*10/$t12
  18. call:print & shift& goto:beg
  19. :etime <beginTime_VarName> <endTime_VarName> <retVar>
  20. Set/a "%3=(!%2:~,2!-!%1:~,2!)*360000+(1!%2:~3,2!-1!%1:~3,2!)*6000+1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-8640000*(%3>>31)"&goto:eof
  21. :getinf 获取版本信息和CPU信息
  22. ver&wmic cpu get name|find "CPU"
  23. set NUMBER_OF_PROCESSORS&goto:eof
  24. :print 格式化输出
  25. set "prt="!cmd!"                                  "
  26. set $cf=      !$cff!.!$r!&set $cf=!$cf:~-8! Hz
  27. if !cmd:~37!. neq . (echo "!cmd!" @ !$cf!)else (
  28.     echo !prt:~0,37! @ !$cf!
  29. )
复制代码

TOP

从你的测试数据看,win7想对于xp:
仅外部命令启动所花费的时间变少了,是xp时间的一半。
cmd的内部命令执行效率反而低了!而且低了1倍以上!
像set这样实用非常频繁的指令,xp下执行的效率是win7的近4倍!
很意外,这到底是什么原因呢?

TOP

返回列表