[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
把多行命令合成组执行,批处理对组()内的多行代码一次性预完成的。
()分组包括If () for () 和直接(),和用&并行

这倒是不知道,学习了。。。。。
对于call我现在简直已经到了痛恨的地步了,不到万不得已是绝不用它的。

[ 本帖最后由 随风 于 2009-5-11 00:11 编辑 ]
技术问题请到论坛发帖求助!

TOP

re 2,3楼:
命令耗时单,在附件里的排是好的,发上来就变了,有兴趣的人可以下载附件来看。


看了一下,plp626 所测试的数据,是以for /l 来实现执行次数,本人认为有误差,
因为for /l 本身也要耗时,另外在for /l 内是进行代码组合了的,并不能了解到因预处理所花的时间

就拿shift 这个命令来说吧,其单条命令应为0.19毫秒,相当于一行rem行的时间,而在组合里面,它用时则仅为0.01毫秒。



而我的方法是,把一千行命令写到一个临时BAT,并在这一千行代码的头尾,加上取数时间命令set aa=%time%
然后调用这个临时BAT来取得运行一千次命令前后的时间。所以误差较小。

[ 本帖最后由 netbenton 于 2009-5-11 00:16 编辑 ]

TOP

关于命令的耗时,plp626也做过类似的统计:

xp5.1版的单核,2.4G,256M 测试
方法:for /l %%a in (1 1 %1)do %2 结合timediff 函数计算。

命令                                             效率(次/秒)
--------------------------------------------------------------------------------------------------
echo ...                                         364.3
echo... >1.txt"                              119.3 (只要...是一行,耗时与...长度有关,但差别不明显)
echo ...>nul"                                 8772.6
call echo ...>nul                             1204.7
if 1==2 do .....                              61349.7
@echo off                                     71428.6
set d=%x%                                  42553.2
set/a n+=1                                    27411.8
call 空+goto:eof                             917.4
goto循环                                      1219.5
shift                                             102040
echo %%a|find >nul                      8474.5
echo %%a|findstr >nul                  8474.5
for /f ('more') echo >nul                2806.7
for /f ('type') echo >nul                 3932.1
for /f ('findstr .*')  echo >nul         4007.6
for /f ('find /v ""') echo >nul          2966.5
for /f  ( 文件) echo >nul                9807.5
echo.>1.txt                                 181.7
echo off>1.txt                            1666.7
del 1.txt                                      1961.7
pushd %tmp%                            2762.4
cd %tmp%                                  2808.7
pushd                                         76923.1
for /r (.)是for /f (dir/ad/s)速度的2倍。

频繁生成临时文件时用echo off>tmp效率最高。
call echo ...会大大降低echo 的速度。
多用if判断语句,与goto:eof会提高效率。


原文地址:http://www.cn-dos.net/forum/viewthread.php?tid=39841
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

cmd批处理是功能“强大”,但代码运行速度太慢
慢和快通常是相对的概念,我们通过怎样的例子来说明批处理运行太慢呢?如果说批处理慢的话,什么东西快呢?

这可能是当前内部命令是不能接收管道数据的,而是调用了另一个命令解释器

据某高人说,系统内部是通过临时文件来实现管道的。

关于各个命令的耗时,你的排版好像有点乱,能否重新整理一下。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

(接一楼)

5. Goto 标号为什么慢呢? 看:
goto :next  0.27毫秒    (并不慢)
:next
    其实,单个goto 的速度并不是很慢,慢的原因是goto :标号和标号间不支持组合,
也就是每行组指令最少也要0.20毫秒以上。所以通常不应该用goto :标号 来构造循环体,
如果一定要这样时,应该把循环体内的多行,用()或用 “&”进行组合来减少行数。
通常只用在分支,或跳出for 循环。如果不得不用到时,最好用for来辅助以减少循环次数。

6. 注释与也与速度有关吗?
   注释方法有两种.
::号
当发现这以用这种方法后,绝大多数人都喜欢上这种方法,因为觉得它基本上不耗时,
其实并非这样,在运行过程中,系统遇到时相当于处理标号一样的时间:0.05毫秒,
其实只要是一行,就算是空行也要0.05毫秒的时间,也就是基本不用时间。
缺点是不能用在命令行后。也不能用在分组()内
Rem
按道理没有进行作何操作,应该不耗时才对,可是并非如此,单独一行rem要用0.19毫秒,
可见它没有 ::注释高效,是否rem该退休了呢?不,实际并非如此,因为它可以用在行后,
和分组()内,这时它的速度到了0.01~0.02毫秒,这是好多人没有想到的。

7. 外部命令和三方软件的效率问题,文件大少对用时在cmd下相差不是很大,主要是路径的问题,
以直接指明路径最快,在当前路为次,最慢是在%path%路径的最后。三方软件的调用速度是很慢的,
最快操作单个也要12.25毫秒,所以要用到三方的话,尽量在1到3次内完成,不要多次调用三方和外部命令,
特别是不能用在循环体内,除非不得已。这也就是为什么我不想用三方来做界面的原因。
8. 行长与速度,每长30个字符要多用0.01毫秒,因为批处理是一边运行一边解释的,
所以字符串的长短与时间也是有关的。最好是变量名的定义只能要方便看懂,越短越好。


附:(本人对一些命令实测效率,运行1000次所用毫秒数,测试工具请在一楼附件下载)

命令         运行次数      用时(毫秒)
cd.
===   1000  161
echo.
===   1000  158
echo.>nul
===   1000  161
echo.aa>nul
===   1000  182
echo dd>nul
===   1000  30
::dir
===   1000  5
rem dir
===   1000  19
set aa=aa
===   1000  21
set /a aa=1
===   1000  25
set aa=^(3+3^)*1
===   1000  24
set /a aa=8^^3
===   1000  25
for /l %%a in (1,1,10) do rem dir
===   1000  30
for /l %%a in (1,1,100) do set aa=aa
===   1000  193
for /l %%a in (1,1,10) do set aa=aa
===   1000  46
if 22==aaa rem dd
===   1000  21
if 22==aaa set aa=aa
〈〈数据未完,详请看附件〉〉

[ 本帖最后由 netbenton 于 2009-5-11 12:32 编辑 ]
1

评分人数

TOP

返回列表