|
|
为了处理一些windows不方便做的事情时,我们不得不选择cmd批处理来解决问题,
以逸待劳,来为我们服务。稍有一点了解批处理的都知道,cmd批处理是功能“强大”,但代码运行速度太慢。
于是问题出来了,本来我们选择用cmd批处理的目的是为了更方便和更快速的,可是
cmd批处理的速度和我们期望目标成了矛与盾的较量。
同一个问题批处理的解决办法,往往有多种,不同算法之间的速度相差非常之大,
为了提高cmd批处理程序,算法很关键,于是,都费尽脑汁,想方设法找一些巧妙的
方法。在注重算法的同时,往往忽略了或误解了最基本的问题:“批处理命令的效率”
其实了解批处理命令的效率,有一个良好的BAT编写习惯,可以在为了好的算法
伤脑筋时,少走弯路。我根据在cn-dos所学到的简单总结了一下,欢迎各位指出错误。
声明:
以下仅为个人观点,有兴趣的就看看,并不代表权威数据,
特此声明,以免对大家有误导!
**********
因为不同的电脑速度相差太大,为了能有个统一标准,以@echo off 执行间为0.20毫秒为标准
**********
1. 预处理与运行速度
批处理的预处理已经有多人讨论过了,可以在论坛搜索“预处理”查看。这里就不详述,
只讨论预处理同效率的问题。
其实每行代码真正执行的时间不长(0.01~0.02毫秒),可是单单运行一行代码时,
最少也要0.19毫秒(如:注释行rem),为什么呢?我认为:这应该是批处理的运行的
“预处理”造成的,批处理最好的地方在这里却成了拌脚石,有没有办法解决这个问题呢?
有,把多行命令合成组执行,批处理对组()内的多行代码一次性预完成的。
()分组包括If () for () 和直接(),和用&并行,都具有同样的效果,能让系统一次性对多
条指令进行同时预处理,一组命令的用时为:一个预处理时长(0.19毫秒)+每条命令的执行时
长(0.01~0.02毫秒),也就是越多条命令合成一组,效率越高。for 的效率高的主要原因应该就在这里。
2. 管道操作与运行速度
管道操作对象有:程序(外部命令,三方工具等),内部命令(其实是命令解释器),
设备(空设备nul,标准输入输出设备con,打印设备prn,存储设备即常用的文件)
标准设备输入输出间的转换并不会占用很多时间,只有管道操作的对象为程序和内部命令时,
才会突然加大时间开销,如:
echo a 0.41毫秒
echo a>>b.txt, 0.30毫秒
echo. a>>b.txt 1,30毫秒 (不知为什么这一点会多用那么多时间)
findstr “aa” a.txt 44.90毫秒
type a.txt |findstr “aa” 99.12毫秒
for /f %%a in (‘set #’) do (rem), 42.70毫秒
echo a|echo b 90.04毫秒
echo aa|findstr .* 88.84毫秒
echo a|sort 89.12毫秒
sort a.txt 45.45毫秒
abcd.com 12.50毫秒 (一个最直接退出的程序,非管道)
可见,程序和命令进行管道操作是需要很大资源的,为什么内部命令进行管道操作也要那么多的时间呢?
如:echo a|echo b
这可能是当前内部命令是不能接收管道数据的,而是调用了另一个命令解释器,再执行其中一个命令,
所以像调用了一个外部程序一样。for /f %%a in (‘command’) do 也应视为一次管道操作,
而使用“|”是进行了双管道操作所以用时多了一半。
3. 子程序调用时,选择文件还是函数
在cmd下,可以使用call :标号 来实现子过程调用,这种方法可以把多个子功能集中到一个BAT文件内,
进行内部调用。这种方法可以减少BAT文件的个数,可是要是考虑到效率问题时,
与调用外部BAT文件相比会是怎么样呢?测试结果:
Call :sub 3.51 毫秒
Call abc.bat 1.28 毫秒
出人意料!怎么外部调用会比内部调用更高效呢???
4. Call 各种方法中的效率问题
Call 的用法有多种,效率如下:
Call echo %%!n!b%% 1.64毫秒
for %%a in (!n!) do echo !%%ab! 0.63毫秒 看来用用for 来取代上句是可以加速度的
Call set aa=%%bb%% 1.47毫秒
Call :sub 3.51 毫秒 (空操作)
Call abc.bat 1.28 毫秒 (空操作) |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
×
评分
-
查看全部评分
|