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


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


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

TOP

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

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

对了,一万就足够了。

TOP

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

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

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

TOP

18# plp626


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

TOP

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

17# batman


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

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

TOP

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

TOP

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

13# caruko
代码:
  1. @echo off
  2. echo %time%
  3. for /l %%a in (1,1,10000) do set /a _9+=1
  4. echo %time%
  5. for /l %%a in (1,1,10000) do set /a _10000+=1
  6. echo %time%
  7. pause>nul
复制代码
运行结果:
19:12:49.35
19:12:49.57
19:12:49.79
哪来的巨大的相差?
***共同提高***

TOP

大家是不是对代码执行效率有了误解?如对一个变量操作的时间为一个单位,同时对10000个变量操作的时间小于或等于一万个单位,这样的执行效率则是正常。但如对一个变量操作的时间为一个单位,而对10000个变量操作的时间远远大于一万个单位,这样的执行效率就不是正常的,也才能说因为大量的变量的存在让代码执行效率有了改变。
    至于caruko所提出的读取_1和_9999的速度不一样,我认为存在误区,以下面的代码来证明:
  1. @echo off
  2. for /l %%a in (1,1,10000) do set "_%%a=a"
  3. echo %time%
  4. echo %_1%
  5. echo %time%
  6. echo %_9999%
  7. echo %time%
  8. pause>nul
复制代码
我本机上一次运行结果如下(几乎都是不需要时间的,何来的差距很大):
18:59:59.82
a
18:59:59.82
a
18:59:59.82
***共同提高***

TOP

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

12# plp626

for /l %%i in (1,1,10000)  set /a _10000+=2

for /l %%i in (1,1,10000)  set /a _9999+=2

预处理会有很大差距吗?
_9 , _99 , _9999  耗时几乎相同
_1,_100,_10000 耗时也几乎相同

但是 _9 >> _10000,可否说明,跟预处理无关?

1万次 _9 耗时 23.1 秒
1万次 _10000 耗时 5.3 秒

每次的执行时间虽然不固定,但是巨大的差距足以说明问题。

TOP

11# caruko


你怎么排除预处理的因素?

TOP

C的变量,内存的读取,我有一定了解。但是C是编译程序,静态变量一般直接翻译成地址。

如果调用一万个变量 比 调用一万个变量中的 一个变量 速度慢,或许可以解释成CPU缓存与寻址之类的说法。


但是,从 读取 _1 跟 _9999 的速度不一样,以及_9,_5000等调用测试,可以看出:
批处理遍历了一个表,排在前列的读取速度快,排在后面的读取速度慢,而且从表开始到结束,读取耗时是匀速增加的。表的内容是经过排序的,与"set _"的输出一致。

这个结论很容易验证,我已给出代码,大家都可以自己试试,调用不同位置的变量,看看速度有那些差距。


验证过上面的代码后:
如果真的有“变量表”存在,那么P跟C的变量存储方式肯定不同。
set x=1 速度快于 set /a x=1 ,则很可能说明:变量是以字符类型存储的。如果是指针,那么速度应该差不多。

TOP

我们若为提高效率,记住这条实用的:

对数值的单一赋值,set 比set/a 快25%左右。
plp626 发表于 2011-4-22 18:18

这个没留意过,学习了

TOP

有个给大伙的建议,我们在做cmd执行效率的时候,能不能把耗费时间的秒换算成是echo off(或其他某条语句,大伙可以指定可统一标准)语句耗费时间的多少倍,这样方便参考。

都说自己运行耗费了多少秒,那只是时间,没要参考价值的。当然你可以给出自己的cpu型号,内存,但即使这样各人的机子也不同。

效率是单位时间所执行的任务才对。

TOP

我们若为提高效率,记住这条实用的:

对数值的单一赋值,set 比set/a 快25%左右。

TOP

返回列表