返回列表 发帖

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

本帖最后由 plp626 于 2011-6-16 19:04 编辑
@ECHO off
:: cmd 命令执行效率测试,保存为cff.bat于windows目录下,
:: 命令行调用格式:cff 1000 "命令名" "命令名" ...
:: 举例:
::         cff 300 "chcp >nul"
::         cff 10000 "set var=123" "set var=^!random^!" "shift"
::         cff 10000 "for /f %a in ("abcdef")do set str=%a"
:: Version: 1.01; Code by plp; Thanks to: fastslz, batchar
setlocal EnableDelayedExpansion
set/a $lp=%1 2>nul||(
    echo  Parameter %%1 --- %1
    echo     is invalid number.&exit/b2
)
if %2.==. echo Paramter %%2 is missing.&exit/b3
call:getinf&rem :: 获取版本信息和CPU信息
:begin
set "cmd=%~2"
Set $time1=%time%
for /l %%@ in (1 1 %$lp%)do %~2
Set $time2=%time%
call:etime $time1 $time2 $t12
if !$t12!==0 echo Parameter %%1 --- %$lp%&echo    is too small.&exit/b4
set/a $cff=$lp*100/$t12,$r=$lp*100%%$t12*10/$t12
echo === [!$time1! --^> !$time2!=!$t12!] ===
ECHO "!cmd!" : !$cff!.!$r! (Hz)
if !$t12! leq 20 (
   echo.&echo ^^! Paramter %%1 --- %$lp%
   echo    is smallish and maybe the result "!$cff!.!$r!" is not accurate
   exit/b5
)
if %3. neq . shift&goto:begin
goto:eof
:etime <beginTime_VarName> <endTime_VarName> <retVar>
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
:getinf
ver&wmic cpu get name|find "CPU"
set NUMBER_OF_PROCESSORSCOPY

好深奥   一点都不懂     现在只能复制粘贴    用用

TOP

之前在想一个可以测试代码性能的工具
测试结果仅于代码有关
而与测试环境无关

可惜试了很多思路
没有找到足够完整的测试基准
可以抵消测试环境对测试结果的影响
qzwqzw 发表于 2011-6-20 11:12

用DOSBOX之类限制CPU频率即可,或者用虚拟机限制

TOP

本帖最后由 fly2sky 于 2011-6-29 23:45 编辑

原来没有认真看说明,还以为2008R2不行呢

TOP

不明白,求真相
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

之前在想一个可以测试代码性能的工具
测试结果仅于代码有关
而与测试环境无关

可惜试了很多思路
没有找到足够完整的测试基准
可以抵消测试环境对测试结果的影响
天的白色影子

TOP

本帖最后由 fastslz 于 2011-6-19 19:47 编辑

Microsoft Windows [版本 6.1.7601]
Intel(R) Core(TM) i3 CPU       M 370  @ 2.40GHz
NUMBER_OF_PROCESSORS=4
------------ CMD指令测试 -------------
"rem"                                 @ 531359.4 Hz
"break"                               @  58490.4 Hz
"popd"                                @  68252.7 Hz
"set var=!random!"                    @  22737.0 Hz
"call set a=1"                        @    692.5 Hz
"for /f %a in ("abcdef")do set str=%a @  26691.3 Hz
"setlocal&endlocal"                   @   7290.4 Hz
"find /?>nul"                         @    122.8 Hz
"findstr /?>nul"                      @    153.5 Hz


Microsoft Windows XP [版本 5.1.2600]
Intel(R) Core(TM) i3 CPU       M 370  @ 2.40GHz
NUMBER_OF_PROCESSORS=4
------------ CMD指令测试 -------------
"rem"                                 @ 634203.2 Hz
"break"                               @ 153584.3 Hz
"popd"                                @ 182025.9 Hz
"set var=!random!"                    @  66408.1 Hz
"call set a=1"                        @   3179.1 Hz
"for /f %a in ("abcdef")do set str=%a @  74457.5 Hz
"setlocal&endlocal"                   @  10223.3 Hz
"find /?>nul"                         @     29.6 Hz
"findstr /?>nul"                      @     30.4 Hz
还得改进
i3 M370是双核心4线程
NUMBER_OF_PROCESSORS其实是线程数
wmic cpu get NumberOfCores这个是核心数
再增加64bit 或32bit系统
wmic cpu get AddressWidth 或set PROCESSOR_ARCHITECTURE
从上面的数据可以看出原生4核和4线程还是有区别的,xp下外部命令效率提示很明显
@echo off
for /f "delims=" %%i in ('wmic cpu get name^,AddressWidth^,NumberOfCores^,NumberOfLogicalProcessors /Value') do set "%%i">nul
echo %Name%
echo 核芯数 %NumberOfCores%
echo 线程数 %NumberOfLogicalProcessors%
echo %AddressWidth% Bit
verCOPY

TOP

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

TOP

不知道怎么回事,今天怎么测试8楼的也不报错了,见鬼了
cff.bat "rem";"break";"popd";"set var=^!random^!";"call set a=1";"for /f %a in ("abcdef")do set str=%a";"setlocal&endlocal";"find /?>nul";"findstr /?>nul"COPY
Microsoft Windows [版本 6.1.7601]
Intel(R) Core(TM)2 Quad CPU    Q8300  @ 2.50GHz
NUMBER_OF_PROCESSORS=4
------------ CMD指令测试 -------------
"rem"                                 @ 531359.4 Hz
"break"                               @  25579.1 Hz
"popd"                                @  25579.1 Hz
"set var=!random!"                    @  17052.7 Hz
"call set a=1"                        @    947.5 Hz
"for /f %a in ("abcdef")do set str=%a @  17540.0 Hz
"setlocal&endlocal"                   @   5670.3 Hz
"find /?>nul"                         @    138.7 Hz
"findstr /?>nul"                      @    172.0 Hz

Microsoft Windows XP [版本 5.1.2600]
Intel(R) Core(TM)2 Quad CPU    Q8300  @ 2.50GHz
NUMBER_OF_PROCESSORS=4
------------ CMD指令测试 -------------
"rem"                                 @ 531359.4 Hz
"break"                               @ 158538.7 Hz
"popd"                                @ 158538.7 Hz
"set var=!random!"                    @  55831.8 Hz
"call set a=1"                        @   1804.7 Hz
"for /f %a in ("abcdef")do set str=%a @  63002.5 Hz
"setlocal&endlocal"                   @  18055.8 Hz
"find /?>nul"                         @     63.3 Hz
"findstr /?>nul"                      @     63.3 Hz

可见WinXP和Win7 cmd执行效率差异和大

TOP

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

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

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

TOP

1.1版本的:
运行 —> cmd —> 粘贴代码,回车:
cd.>f.t&cd.>g.t
cff "set a=1" "set a=^!random:~2,1^!"; "set a=^!random:2=#^!"; "set abcd12345678901234567890=$$"; "call set a=1234567890"; "call set/a a=2" "call set f=%%a%%"; popd "setlocal&endlocal"; "if a==0 ?"; "for %a in (1)do set b=%a"; "for /f %a in ("1")do set b=%a"; "ver>nul"; "echo off>a.t" "echo.>b.t 4>a.t" "echo.>b.t" "if exist xxxx.txt ?"; "for %a in (#.txt)do set x=%a"; rem; "copy/b f.t+g.t f.t>nul"; "copy f.t+g.t f.t>nul" shiftCOPY
输出:
Microsoft Windows XP [版本 5.1.2600]
Genuine Intel(R) CPU           T1600  @ 1.66GHz
NUMBER_OF_PROCESSORS=2
------------ CMD指令测试 -------------
"set a=1"                             @  70202.8 Hz
"set a=!random:~2,1!"                 @  40943.3 Hz
"set a=!random:2=#!"                  @  37221.2 Hz
"set abcd12345678901234567890=$$"     @  55843.1 Hz
"call set a=1234567890"               @    275.7 Hz
"call set/a a=2"                      @   6124.0 Hz
"call set f=%%a%%"                    @    275.7 Hz
"popd"                                @ 102379.1 Hz
"setlocal&endlocal"                   @   2461.2 Hz
"if a==0 ?"                           @ 136519.4 Hz
"for %a in (1)do set b=%a"            @  43867.8 Hz
"for /f %a in ("1")do set b=%a"       @  43867.8 Hz
"ver>nul"                             @   6124.0 Hz
"echo off>a.t"                        @   2631.0 Hz
"echo.>b.t 4>a.t"                     @   1263.3 Hz
"echo.>b.t"                           @   1804.7 Hz
"if exist xxxx.txt ?"                 @   6959.0 Hz
"for %a in (#.txt)do set x=%a"        @  39622.5 Hz
"rem"                                 @ 351067.8 Hz
"copy/b f.t+g.t f.t>nul"              @    748.0 Hz
"copy f.t+g.t f.t>nul"                @    692.5 Hz
"shift"                               @ 140420.0 HzCOPY
SOS --- >> lllsoslll@163.com

TOP

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

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

TOP

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

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

TOP

5# plp626


是啊、可以猜测一下
cmd+系统自带外部命令 单线程、多个线程
cmd+内部命令  只能是单线程

建议改进下代码,测试每秒能运算圆周率小数点位数

TOP

4# fastslz


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

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

TOP

返回列表