返回列表 发帖
应该是行尾的空格在作怪。
技术问题请到论坛发帖求助!

TOP

优化后的代码为:
@echo off
set tm=%time%
(for /f "delims=" %%a in (B.txt)do if not defined .%%a set ".%%a=i"
for /f "delims=" %%a in (A.txt)do if not defined .%%a echo %%a
)>888.txt
echo %tm% %time%
pauseCOPY
比你之前的代码只是在变量名前面多加了个点,怎么会使效率如此低下?
节省了7万次开关I/O 居然会没有区别?
技术问题请到论坛发帖求助!

TOP

回复 10楼 的帖子

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

TOP

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

TOP

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

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

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

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

TOP

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

TOP

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

TOP

总结了下楼主的测试结果,按19的编号。
代码一、40分钟06秒
代码二、39分29秒
代码三、39分26秒
.
netbenton 16楼的代码 39分49秒
减少了122530次 if defined 判断,但效率却反而更慢了~
难道是因为16楼多用了两对多余的括弧?
这两对括弧比122530次 if defined 判断还要耗时?
越发费解~
技术问题请到论坛发帖求助!

TOP

回复 24楼 的帖子

!a[$1]++

百思不得其解,能解释下么?
技术问题请到论坛发帖求助!

TOP

返回列表