[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
但是楼上似乎忽略了set命令本身也有启动耗时,一次计算耗时和一次启动耗时应该相差很大的,我写了以下代码验证,结果证明1*1与1234567890*1234567890的耗时分别为13秒与17秒
  1. @echo off&setlocal enabledelayedexpansion
  2. set s=1*1
  3. title %s%
  4. for /l %%a in (1 1 9) do set s=!s!,!s!
  5. echo %time%
  6. for /l %%i in (1,1,20000) do (
  7.      set /a %s%
  8. )
  9. echo %time%
  10. pause
复制代码

TOP

set本身也有启动耗时,并且应该远远大于计算耗时,所以需要以set /a n*n,n*n的形式来尽量缩小启动用时所占的百分比
我写了一段代码来证明,1*1与1234567890*1234567890耗时分别为13秒与17秒,证明计算耗时是存在的,并且相差很大
  1. @echo off&setlocal enabledelayedexpansion
  2. set s=1234567890*1234567890
  3. title %s%
  4. for /l %%a in (1 1 9) do set s=!s!,!s!
  5. echo %time%
  6. for /l %%i in (1,1,20000) do (
  7.      set /a %s%
  8. )
  9. echo %time%
  10. pause
复制代码

TOP

以楼主给出的这两对数字,以32位系统来说,速度是一样的
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

set本身也有启动耗时,并且应该远远大于计算耗时,所以需要以set /a n*n,n*n的形式来尽量缩小启动用时所占的百分比
我写了一段代码来证明,1*1与1234567890*1234567890耗时分别为13秒与17秒,证明计算耗时是存在的, ...
zm900612 发表于 2011-3-20 13:03

看不出你的这段代码与以前的有什么本质上的不同
启动耗时当然会有(我这里理解为将命令加载到内存并进行预处理的耗时)
而且也有可能确实大于计算耗时(我这里理解为命令在内存中参与运算和执行的耗时)
但你的代码如何能证明启动耗时与计算耗时相差极大?
你确认你的代码对于1*1和1234567890*1234567890
他们的启动耗时(具体的说就是对命令行的预处理)是一样的吗?
如果不是一样的
你又如何比较计算耗时的差别呢?
天的白色影子

TOP

好吧,那我们来总结一下,暂时把一句set /a的耗时划分为六部分:
1、语块的预处理耗时
2、变量延迟耗时
3、set命令的启动耗时
4、算式的预处理耗时
5、读取变量耗时
6、计算耗时(实际操作的时候不知道是否和第四部分同时完成)
7、赋值耗时

在这几部分中,1、2、3部分的耗时浮动可以多次测试用平均值尽量排除,而第5、7部分在我的测试代码中不存在,也就是说,我们现在争论的焦点是不同情况下“算式的预处理耗时”之间和“计算耗时”之间的差异。
这一点用批处理似乎没办法验证吧?

TOP

听说, 真理是掌握在少数人手里的, 我看正方人少, 就支持了下

TOP

本帖最后由 qzwqzw 于 2011-3-21 14:22 编辑
不同情况下“算式的预处理耗时”之间和“计算耗时”之间的差异。
这一点用批处理似乎没办法验证吧?

我是否可以理解为
你已经取消了以前“计算耗时是存在的,并且相差极大”的论断?

正如你说
计算耗时与预处理耗时难以严格区分
但是你从我的批处理代码仍然没有看出什么吗?

是的
1*1和1234567*1234567必然会有预处理上的差异
我们所能做的只有尽量减少这部分差异
所有我使用了从内存变量中读取操作数的做法
那比从命令行读取操作数要快很多
相对而言耗时差异也会缩小
天的白色影子

TOP

这个是我没考虑周全,我原以为读取变量会慢些,所以当时没细想。但是楼上既然知道启动耗时大于一次计算耗时,那为什么一次set中只计算一次呢?这样一来计算耗时之差会被set启动耗时淹没,自然不明显了。我用set /a 1*1,1*1,1*1,1*1....的办法就是为了让计算耗时所占比重最大化。
  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1&set s=n*n
  3. for /l %%a in (1 1 9) do set s=!s!,!s!
  4. title %n%
  5. echo %time%
  6. for /l %%i in (1,1,10000) do (
  7.      set /a %s%
  8. )
  9. echo %time%
  10. pause
复制代码
结果n=1时耗时39秒,n=1234567890时耗时44秒,这又作何解释呢?

TOP

至于15楼的代码,我不懂编程,但是从vbs和bat的差别中猜测编程的计算方法、赋值方式完全不同于bat,所以exe的计算速度远快于cmd,生命游戏就是一个例子,可以exe版和bat版生命游戏来对比出同尺寸图、同样代数的用时

TOP

本帖最后由 caruko 于 2011-3-22 12:48 编辑

楼上,你将S设为INT型,差距应该比10MS大

呃,我说的是15楼

TOP

批处理怎么设值变量类型??

TOP

那个, 加法的汇编指令就一条, 乘法的汇编指令也是一条

虽然, 不同指令, 速度很可能不一样, 但是, 运行一条指令, 时间几乎可以忽略不计

而加法, 乘法指令, 是内置的, 速度, 应该差不到哪里去, I see.

TOP

不懂编程,不过我觉得如果乘法只是加法集合成的函数,那不见得速度一样快

TOP

本帖最后由 qzwqzw 于 2011-3-21 20:37 编辑


现在问题的讨论方向终于有些触及我所思考的核心了

对于23楼的程序我的解释是这样的
虽然你降低了命令启动的次数
但是仍然没有完全排除计算前读取时间的差异
反而是扩张了这部分差异的影响
从一个变量中读一个字符和一个字符串的差异是很明显的

关于这一点你将测试数据改为
123456789*123456789  (=15241578750190521)

987654321*987654321  (=975461057789971041)
就会体会到了
这两组数据的结果差值甚至大于1*1与123456789*123456789结果插着
但实际前两组数据的运行时间几乎是相同的
天的白色影子

TOP

stop,要想不跑偏必须先统一一下意见,因为以后的讨论可能是以此为前提的:
1、set 命令读取变量时的速度快于预处理解释字符串的速度,也就是说set /a m=n(此时n=1)真的快于set /a m=1吗?
2、set 命令读取变量的速度是否取决于变量的字符串长度?

暂时没时间做实验,证明这两个假设的工作先交给诸位了哈...

TOP

返回列表