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


对变量的结论你是怎么得出的? 猜测的话你的控制实验现象是什么?

你看一些介绍中缀表达式计算的C代码,扩展后可以操作变量,可以解释文本里的数学公式,并有简单的编程功能,都是堆栈的方式,每一条命令行语句,对变量的读取,就是读地址,预处理的时候变量的字符串已经成为常量,cmd把这个常量转换为散列地址,你赋值时后它已经放在哪,然后读变量的时候cmd又把这个变量解释为散列地址,就直接取值了,若没定义过它就返回空。只是谁也没见识过cmd的源代码,汇编也是更是门外汉。

cmd里的random,errorlevel,date,time变量又不同于我们定义的变量,对于延迟处理我们还是靠现象猜测,有时候我给cmd发一条好长的复合语句,它会报告存储空间不足,无法处理此命令,我们是在黑暗中摸索,较真的话,很耗费时间精力的。

TOP

其实我不是想只说明变量越多,速度越慢的问题,这个经常写bat的一般都有了解。

我希望大家谈谈对“变量的存储、读取” 方面猜测理解。

环境:
先设置1万个变量,从_1到_10000。

测试1:调用“_9999”这个变量1万次,再 调用“_1”这个变量1万次,耗时比 27:6 。

测试2:调用_1,_1000,_10000这3个变量执行1万次计算,3者耗时相差仿佛。调用 _99,_999,_9999,以及唯一的一个字符变量"_x",4者调用耗时也相差仿佛。

测试3:将_1--_10000这一万个变量都调用一次 ≈ 调用 _5 | _5000 这些变量一万次。


从上面测试结果来看:
1.  "变量增多,耗时越多"的原因,跟内存的关系不大!!因为1万个小变量不会导致内存不够,其它程序语言变量没有多到阀值,多少也不会有明显影响。

2.  变慢的原因可能跟批处理在预处理变量时,进行变量名查找匹配的速度有关。

3.  批处理内应该有一张表,按照排序好的顺序,存储着变量名(也可能含有以字符类型存储的变量值,或者内存指针)。

4.  批处理在预处理变量时,遍历变量表,取出匹配的变量名,再取得该变量的值。

5.  批处理在读取变量表时,很可能有一个复制(或者别的)操作(这可能是变量越多越慢的另一个原因)。 因为从一万个元素的Array(10000)数组中读取Array[0] 的速度,绝对不会比从Array(1)中读取Array[0]的速度慢太多。而这在批处理中的差距是几千倍。

大家有什么看法??

TOP

我上个月做过一些关于效率的测试,原因不解释...部分结果如下:
1、正如楼主的结果证明的那样,存在大量变量时,读取变量的效率会极大地降低,不含变量时,命令效率不变。
2、单纯读取变量快于变量偏移,变量偏移快于变量替换,并且变量偏移的效率与偏移量关系不大

另外赠送两个:
3、外部命令启动速度都差不多,而不仅仅只有findstr慢,另外,文本写入速度与外部命令启动速度相当,读取速度的测试结果忘了
4、预处理!str!比%%a快

TOP

本帖最后由 caruko 于 2011-4-22 16:28 编辑

并不只是内存的问题。而是CMD的变量存储读取机制问题。

否者,为什么调用第一个变量的速度比调用最后一个变量的速度快几倍?

而且,一定程度上解释了,set 存放变量的时候是排序好的。
并且 set _ 这类代码的作用,说明set 存放变量很可能是 数据库 的方式。

TOP

本帖最后由 zm900612 于 2011-4-22 16:16 编辑

cmd的cpu占用(低于百分五十)和内存占用(低于XXMB,具体值忘了)都是有上限的,无论用几G的内存都不可能超过那个值,题外话,我以前有过利用双cmd进程并行实现最大程度利用cpu的想法,但是当时背景不对,效果不显著。

TOP

  caruko很有研究和较真的精神,先在这里赞一个!的确,我们在平常一直要求新手写代码的执行效率要高。

这只是为了大家养成一个好的习惯而已。而其实我们在实际中处理问题都是现写现用,有时根本没有去考虑代码

执行效率的问题,只求能把问题解决了就好。毕竟程序再怎么慢也要比人手动快n倍,说句俏皮话:让代码飞一会

儿。当然,在学习研究的时候我们还是要注重这个代码执行效率的问题。

  当代码运行时产生大量的变量肯定是对运行时间有影响的,因为变量是储存在内存中的,也就是说变量越多

程序消耗的内存就越大,大家都知道当内存占用率接近100%时,用电脑做任何事情都是很慢很慢的,在这里

是一个道理,当程序运行时产生足够多的变量时,它就会占去绝大部分的内存空间而导致电脑变慢甚至死机(

不信的话就用批去定义一亿个变量)。大家注意在这里变量所影响的并不是程序的执行效率而是电脑的运算处

理速度,所以个人认为只要电脑的内存足够大,大量的变量的存在是不会对程序的执行效率带来多大的影响的。
***共同提高***

TOP

返回列表