[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
14# batman

你只执行一次,当然看不出来。 循环一万次试试??
  1. @echo off
  2. for /l %%a in (1,1,10000) do set "_%%a=a"
  3. echo %time%
  4. for /l %%a in (1,1,10000) do set /a _1+=1
  5. echo %time%
  6. for /l %%a in (1,1,10000) do set /a _9999+=1
  7. echo %time%
  8. pause>nul
复制代码

TOP

16# caruko
看我13楼是不是10000次?
***共同提高***

TOP

本帖最后由 caruko 于 2011-4-22 19:27 编辑

17# batman


你13楼代码,没有初始环境!
在最前面加一句
for /l %%a in (1,1,10000) do set /a _%%a=1

附件: 您需要登录才可以下载或查看附件。没有帐号?注册

TOP

18# plp626


你说的这些,就跟《量子力学》与《牛顿定律》一样。
从相对恒定的常规环境中的测试结论,得出的《牛顿定律》仍然可以说明常见现象。
扯那么深远,的确我测试不出来。

TOP

楼上的大哥...
我说了,前提是有一万个变量的测试环境。 然后取第一个_1跟最后一个_9999。

你的代码,相当于环境中总共只有2个变量。
也就是只差一个位置,差距在那里?

请仔细看看我20楼的图,分析一下代码。

TOP

本帖最后由 caruko 于 2011-4-22 20:09 编辑

也就是说,在你的代码中,第2行中添加一句代码。
for /l %%a in (1,1,10000) do set "_%%a=1"

对了,一万就足够了。

TOP

25# plp626


好吧,被你打败了。
你的 CALL执行完,结果为0,没分析你的算法。
但请你直接ECHO %time%吧


20:14:04.89
20:14:26.03
20:14:30.26
请按任意键继续. . .

TOP

本帖最后由 cjiabing 于 2011-4-22 20:53 编辑

虽然俺不是专家,不过看见你们瞎忙乎,很想和你们谈谈一些个人认识。
      计算机有 0和1 两种基本信号,编码后组成一些最基本的字符列阵,这些字符列阵在系统中被其它程序广泛使用。具体搜索下“计算机编码”、“字符集”、“进制”。字符集应该这就是你们谈到的“字符表”了。这些字符表、字符集也是按照计算机编码顺序组成的,如果记得当年的那些什么码输入法你可能会幡然醒悟。但假如没有也不要紧,系统一般自带了这些字符映射信息。
      通常,XP系统里的字符集位于:【开始菜单——附件——系统工具——字符映射表】,真实路径位于:【  %SystemRoot%\system32\charmap.exe  】,可在运行里输入【 charmap 】打开。这就是字符映射表。将鼠标随便移动到字符表上,稍加停留,或者点击,你就能看到任意字符在字符表中的ID。然后你再看看排在最前面的几个是什么字符,你就知道可能的读取速度了。一般我们认为,可能受到编码进制的影响,排在前面的编码顺序要比后面的快。当然,这些在平时是感觉不到的,只有像你们折磨CPU和内存的时候它才表现出来。——这个可能需要更多的证据。
      再谈谈你们测试方法存在的问题。当你们通过产生大量变量来处理问题的时候,我就想到了洪水对河道的霸占。当暴雨剧降,河水泛滥,河道无法容纳足够的河水,于是溢出。而当暴雨过去,河水的消退也需要一定的时间。从变量的增加到变量的清除,内存或者cpu的处理都需要时间和空间,而这个时间是不能用增加时和清除时的时间简单相加和平均的来算的。
      再者,批处理融入到系统内部,它处理的时候应该是内部处理,只是它有许多外部接口。做个试验,在一个简单循环程序中,使用“@echo off”会明显比不使用该开头的程序运行速度快,因为后者运行时进行了重定向。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

26# caruko


老了,把函数的et忘了改了成%3了;
  1. :etime
  2. set/a %3=1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-6000*("%3>>31")
复制代码
你的试验数据属实,不过我把你才试验改进下,不是相差4.5倍,是相差70倍,我得到一个很有意义的结论。
这个结论对我们在进行大量变量赋值时具有很现实的指导意义。

待会告诉大家。

caruko为大家做了一个很有意义的试验。暂一个。

TOP

本帖最后由 plp626 于 2011-4-23 09:41 编辑

结论就是:                                            【结论就是,只看测试代码运行结果,或者直接跳到40楼】

endlocal(不是setlocal)释放掉大量垃圾变量后赋值操作才会变快

代码比较如下:
  1. @echo off
  2. :: 测试一,垃圾变量在变量空间一内,变量二空间内变量的赋值耗时测试
  3. setlocal enabledelayedexpansion
  4. call:tt
  5. call:etime t1 t2 one
  6. set one
  7. for /l %%a in (1,1,10000) do set _%%a=1
  8. endlocal&Set one=%one%&setlocal enabledelayedexpansion
  9. call:tt
  10. call:etime t1 t2 two
  11. set two
  12. set/a pp=two/one
  13. echo 倍数: !pp!
  14. pause
  15. :tt -------------------------- sub -----------------------------
  16. set t1=%time%
  17. for /l %%a in (1 1 10000)do set/a _9+=2
  18. set t2=%time%
  19. goto:eof
  20. :etime
  21. set/a %3=1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-6000*("%3>>31")
  22. goto:eof
复制代码
  1. @echo off
  2. :: 测试二,垃圾变量在变量空间二而内,变量空间二内变量的赋值耗时测试。
  3. setlocal enabledelayedexpansion
  4. call:tt
  5. call:etime t1 t2 one
  6. set one
  7. endlocal&Set one=%one%&setlocal enabledelayedexpansion
  8. for /l %%a in (1,1,10000) do set _%%a=1
  9. call:tt
  10. call:etime t1 t2 two
  11. set two
  12. set/a pp=two/one
  13. ECHO 倍数:!pp!
  14. pause
  15. :tt -------------------------- sub -----------------------------
  16. set t1=%time%
  17. for /l %%a in (1 1 10000)do set/a _9+=2
  18. set t2=%time%
  19. goto:eof
  20. :etime
  21. set/a %3=1!%2:~-5,2!!%2:~-2!-1!%1:~-5,2!!%1:~-2!,%3+=-6000*("%3>>31")
  22. goto:eof
复制代码

TOP

29# plp626


你的代码,好像不是 全局 与 局部 的关系啊。
而是2个相对独立的局部。

这样的意义就相当于:
当我们需要大量变量参与计算(计算后这大量的变量需要废弃),而我们只需要计算后的少数几个结果,那么可以setlocal,减少之后其它语句的运行耗时。

TOP

29# plp626


你的代码,好像不是 全局 与 局部 的关系啊。
而是2个相对独立的局部。

这样的意义就相当于:
当我们需要大量变量参与计算(计算后这大量的变量需要废弃),而我们只需要计算后的少数几个结果, ...
caruko 发表于 2011-4-22 21:57


你说的对,是两个相对独立的局部。。

TOP

是啊,没考虑过setlocal对此有没有影响。

ZM谈起大量变量影响效率,自己当初也做过生命游戏,做出过耗时3分钟跟15秒的不同版本,但当时没有深想。

现在回想起来,感觉变量大量存在导致的效率问题,超出了其它程序语言的N倍,而且SET 自带排序输出(耗时时很少) 。就猜想set中的变量,很可能是有序存储的。

然后就做了测试,发现了新的问题。
另外就是 _1 跟 _9 之间的效率差距问题,到底是否可能存在有序的变量表?

TOP

用1和10000来做对比测试不太严谨吧,因为字符长度会影响预处理耗时,不如改成类似10000和16383的数(十进制和二进制位数均相同)
plp626兄台的测试代码我有点看不懂啊,endlocal之后不是不存在刚刚制造饿垃圾变量了么?

TOP

题外话,好像本贴标题变了四五次了...

TOP

返回列表