提前告知大家:发此帖子为了大家共同完成接力任务,【请看二楼的帖子】,
希望关注此帖的fans能继续接力任务
cmd基本命令耗时预备知识
测试方法:- set aa=%time%&for /l %%a in (1 1 10000)do echo .......
- call etime %aa% %time%
复制代码 和- set aa=%time%&for /l %%a in (1 1 10000)do set a=0
- call etime %aa% %time%
复制代码 将时间差进行比较,{etime代码看此帖http://bbs.bathome.net/thread-4701-1-1.html}
我们计最基本的set var=... ; [这里...一般不超过30字节]为一个时间单位
我初略试了试发现如下:
预处理耗时:【0.55】
一个if 判断语句 或者 for %%a 或for /f ... ("string") 相当于0.5~0.6个时间单位
set /a 耗时:【1.1~1.7】
set/a a=... 含一个等号,相当于1.1~1.7 时间单位
set/a a=... 多个等号,相当于 0.96*n个 时间单位
二次预处理算术运算赋值 耗时 【2】
一个call set/a ... 含一个等号 相当于 2 个时间单位
echo 命令耗时 【9.5】
echo ... [这里...一般不超过50字节]
变量作用域设定耗时:【12】
一对setlocal endlocal 执行一次 相当于 12 时间单位
set/p=... <nul 耗时 【29】
set/p=... <nul [这里...一般不超过50字节]
跳转耗时:【72 】
仅仅一个goto 标签或者call :标签 相当于72个时间单位!!!
二次预处理赋值耗时:【108】
一个call set 相当于 108个时间单位
call echo 耗时 【120】
call echo ... [这里...一般不超过50字节]
三方命令耗时 【2500左右】
非cmd内置命令的外部工具或者for /f ... %%a in ('commond')do 相当于2450个时间单位
其他的大家继续补充,或者写个代码做批量测试,此工作还是蛮有意义的, 以后分析算法的效率一定很有用
现在我拿折半法求字符串长度的代码分析耗费的时间单位-
-
- @echo off&setlocal enabledelayedexpansion
- set "str=afdjg do men contgfirfmck song putint"
- :binsearch //by 随风
- set /a max=8190,min=0 // 【2.2】
- for /l %%a in (1,1,14) do ( // 【0.55】
- set /a "num=(max+min)/2" //【1.15*14】
- for /f "delims=" %%b in ("!num!") do if "!str:~%%b!" equ "" (set /a max=num) else set /a min=num //【0.55*14+(0.6+1.1)*14】
- )
- if "!str:~%num%!" neq "" set /a num+=1 //【0.55+1.1】
- echo 经计算字符串str共有%num%个字符
- pause>nul
复制代码 可以看出这个binsearch耗费 33.8 个时间单位,效率不错
--------------------------------------
-----------------------------
代码中有
findstr
find
sort
more
*.vbs
*.exe
*.com
for /f ... ('commond')do ...
goto
call :label // 对于过于复杂的代码子过程能提高可读性,缩短编写时间,这个就单另说了,但是绝大多数使用call,goto命令的代码【可以说接近百分之百】都可以转换为for语句
其中之一者,切记不要让他进入循环
findstr
find
sort
more
*.vbs
*.exe
*.com
for /f ... ('commond')do ...
其中之一,其执行次数不要超过两次
否则,你的代码效率将慢如驴。。。
[ 本帖最后由 plp626 于 2009-10-10 17:53 编辑 ] |