[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
总结了下楼主的测试结果,按19的编号。
代码一、40分钟06秒
代码二、39分29秒
代码三、39分26秒
.
netbenton 16楼的代码 39分49秒
减少了122530次 if defined 判断,但效率却反而更慢了~
难道是因为16楼多用了两对多余的括弧?
这两对括弧比122530次 if defined 判断还要耗时?
越发费解~
技术问题请到论坛发帖求助!

TOP

我在此对于我在测试阶段的感想吧!我现在对于超长文本每次大家提供的代码我都测试,从batman最早的代码到现在,几乎每个都在40分钟测试了大概10多次了吧,个人感觉测试环境主要是机器配置的影响,跟是否浏览网页,是否还运行bat文件没有太大的关系,只要你内存足够,未满负荷,就没有太多的影响,甚至在测试自己原代码的时候,跟随风谈到ping的问题,曾开了另外3个cmd窗口测试ping的时间问题,结果最后顶楼我那个原始代码的测试时间还是最短的,曾截图发在群里时间为:37 分39秒,当然如果哪位有时间,我仍希望cpu内存足够的空机做测试,以便于更接近于科学,顺便证明一下以上我说的是否正确,毕竟一切都在于研究探索发现嘛
学海无涯

TOP

回复 16楼 的帖子

测试时间39分49秒
学海无涯

TOP

不防把三个代码都编个号
代码一、
  1. @echo off
  2. set tm=%time%
  3. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  4. for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a>>888.txt
  5. echo %tm% %time%
  6. pause
复制代码
代码二、
  1. @echo off
  2. set tm=%time%
  3. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  4. (for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a)>888.txt
  5. echo %tm% %time%
  6. pause
复制代码
代码三、
  1. @echo off
  2. set tm=%time%
  3. echo. >nul 3>888.txt
  4. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  5. for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a
  6. echo. >nul 4>con
  7. echo %tm% %time%
  8. pause
复制代码
三个代码,不知道最后结果888.txt有多少行?先假设是9楼 keen 推测的2万行吧。
第一个代码和第二个代码的区别是
第一个代码只有第一个for占用了内存,但开关 i/o 2万次。
第二个代码两个for都占用了内存,但开关 i/o 1次
但这两个代码的效率却差不多,说明什么?
难道说开关 i/o 2万次 和 将2万个邮箱地址赋予内存效率是一样的?
但第三个代码的效率,楼主测试也是差不多的,这就很难理解了。
因为它也是只有第一个for占用了内存,并且也只开关 i/o 1次,怎么会效率没有区别呢?
费解~
技术问题请到论坛发帖求助!

TOP

第一个for的if defined判断确实可以去掉,但考虑到楼主已经测试了很多代码而且耗时都不短,为了在同一起跑线,所以后面的代码都特意保留了第一个for 的 if defined
但现在看楼主的测试结果,说实话对楼主的测试环境很是怀疑。
似乎他的第一个代码效率是最高的。而从我们的理论上来说却应该是最低的~
技术问题请到论坛发帖求助!

TOP

回复 14楼 的帖子

你这个代码测试的时间是39分29秒
学海无涯

TOP

第一个for的if defined判断可以去掉,变量判断也是要时间的。
因为 . 号在任何系统变量的前面,加一个 . 可以免掉批处理在匹配变量时,对系统变量的扫描,可以加快速度。
其实最好是在前面加 # 号或 $  号,因为它们还要在 . 号的前面。

按楼主的数据,下面的代码应该可以提速3分钟左右。
  1. @echo off
  2. set tm=%time%
  3. for /f "delims=" %%a in (B.txt) do set #%%a=i
  4. (for /f "delims=" %%a in (A.txt) do (if not defined #%%a (echo %%a)))>888.txt
  5. echo %tm% %time%
  6. pause
复制代码


2009.6.28
[更正]  “加.可以提速”的错语说法,如果使用的变量数量不是很大时,确实可以小提速,但是如果变量数量越大,就会让很多的.也占用了内存。变成得不尝失了。

我了解到:
批处理的变量在内存中的是这样连续存放的(即变量环境)

0 “变量名1”=“变量值1”0 “变量名2”=“变量值2”0 “变量名3”=“变量值3”0 。。。

并由[变量环境长度]保存所占内在的大小

当设置变量时,会先对整个变量环境进行扫描,如果已经有该变量名,则把该变量取出,其后面的变量内容前移,然后再把设置的变量及新值放在最后,再修改[变量环境长度]的值。如果环境中还没有该变量,则直接放在最后。

可以看出,每一次变量的设置及取值,都会对[变量环境]进行一次扫描,虽然内存的读取速度很快,但是随着[变量环境]的增大,需要扫描的范围也就越大,速度肯定会越慢。

所以增加的 . 会随着变量数量的增加,明显的使用[环境变量]“肥”了不少

看来,对于批处理效率来说,变量名是越短越高效的。

[ 本帖最后由 netbenton 于 2009-6-28 11:26 编辑 ]

TOP

回复 13楼 的帖子

楼上的这个用了39分26秒
学海无涯

TOP

我想是找到问题原因了
bb.txt 每行一个邮箱地址,共122530行
分别作了以下测试,证明设置大量的变量不但耗费内存,而且及其影响效率。
代码一、耗时 0 小时 0 分钟 18 秒 21 毫秒
  1. @echo off
  2. set t=%time%
  3. echo. >nul 3>888.txt
  4. for /f "delims=" %%a in (bb.txt)do (
  5.    set ".asklfjkaldfjajfafd@.fjaa=i"
  6.    echo %%a
  7. )
  8. echo. >nul 4>con
  9. call time0
  10. pause
复制代码

代码二、直到内存报警还未出结果
  1. @echo off
  2. set t=%time%
  3. for /f "delims=" %%a in (bb.txt)do set ".%%a=i"
  4. call time0
  5. pause
复制代码

测试环境xp sp2 内存512m  Celeron(R) cpu 2.40GHz
.
看来7楼代码效率低是括弧用的不对,改进如下,最好请楼主再测试一下,数据更标准。
效率应该会高些,但不会有太大区别,因为最终结果888.txt的行数并不太多。
.
总的来说应该是13楼代码效率最高,因为占用内存是最少的。
其次应该就是下面的代码,
最慢的应该是11楼的。
  1. @echo off
  2. set tm=%time%
  3. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  4. (for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a
  5. )>888.txt
  6. echo %tm% %time%
  7. pause
复制代码

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

TOP

如果楼主有时间还可以再试试这段代码,看到底谁更快些。。
话说,7楼与11楼代码效率不相上下,实在有点想不通~
:
  1. @echo off
  2. set tm=%time%
  3. echo. >nul 3>888.txt
  4. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  5. for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a
  6. echo. >nul 4>con
  7. echo %tm% %time%
  8. pause
复制代码
技术问题请到论坛发帖求助!

TOP

回复 11楼 的帖子

额。。。这个测试了40分钟06秒
学海无涯

TOP

回复 10楼 的帖子

不防给你原来的代码变量名也加上一个点,再测试,更公平
  1. @echo off
  2. set tm=%time%
  3. for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
  4. for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a>>888.txt
  5. echo %tm% %time%
  6. pause
复制代码
技术问题请到论坛发帖求助!

TOP

回复 7楼 的帖子

09-06-27
今天早晨再次用7楼的代码进行测试,时间为39分04秒
仍旧比我的原代码多了1分钟,还请亲自验证,以及分析一下原因
学海无涯

TOP

回复 7楼 的帖子

应该没有7万次的I/O开关。
楼主的代码只是把A中有,而B中没有的写入到888.txt中,从楼主得到的888.txt文件的大小(289k),把每个邮件地址算成13个字节左右(大概)。用289k除一下13字节,估计是2万多行。

不知道效率低了,是不是因为给变量加了个点作标示引起的,还是别的原因,有待研究。

有不对的地方,请指教。
(*^_^*)

TOP

5楼说的对,还应该加/L参数。

另外,findstr 本来就是不可信任的,存在诸多已知和未知的问题。在很多场合尽量不要用findstr。
  1. echo 王志慧|findstr ".*净"
  2. set>env.tmp
  3. findstr /l /v /x /g:env.tmp env.tmp
复制代码
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

返回列表