中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-07-14 12:41
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 据说是p处理最快循环的代码 查看 1,083 回复 8
楼 主 据说是p处理最快循环的代码 发表于 2007-02-20 05:59 ·  中国 四川 成都 电信
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
原帖地址:
http://groups.google.com/group/alt.msdos.batch.nt/browse_thread/thread/4cc47d72586a2e73


Okay, here is my final bisection thing, but it's now written
in only ONE Line.
That line is very long, exact 418 visible char long:
(if not defined Result ... goto%0

Two things are required: ".BAT" extension, and a variable
named Result must be empty.


The testing loop, in (2147483647, -33554428, 0),
would count down from 2147483647, and stop on 255.


If a loop with that same speed for each number you see, it would
have calc/found that number after more than four years. In other
words: if you run the test loop (take about 4 seconds), and then
see a message: 255. "All Done", Press any key ..., then you have
displayed the same data as would have taken more than 260 years,
So, I would say this loop is fast. Besides that, it shouldn't be
a problem for you to rewrite it for whatever, other purpose than
exit-codes/errorlevels...


Benny


@echo off
setlocal enabledelayedexpansion
(set Result=)
for /L %%I in (2147483647, -33554428, 0) do (
call :ErrMake %%I
call :ErrFind > nul
echo !ErrFind!.
REM if "!ErrFind!" neq "%%I" echo OOPS.& exit /b
)
endlocal
call:_& echo All Done.& pause
goto:eof


:ErrFind
(if "!Result!"=="" set Result=%0&set Result=!Result:~1!&(if not errorlevel 1 set !Result!=0&set Result=&goto:eof)&set H=2147483647&(if errorlevel !H! set !Result!=!H!&set Result=&goto:eof)&set L=0)&set/a A=H/2+L/2&echo H:!H! A:!A! L:!L!&(if errorlevel !A! ((if !L!==!A! set/a A+=1&(if not errorlevel !A! set A=!L!)&set !Result!=!A!&set Result=&goto:eof)&set L=!A!)else set H=!A!)&goto%0


:ErrMake X
if /i "%~2"=="norm" (set errorlevel=)
if /i "%~2"=="both" (set errorlevel=%~1)
if /i "%~2"=="user" (
cd.\&(set errorlevel=& if errorlevel 1 exit /b %~1
call:_
echo It is recognizable that a variable errorlevel
echo have been manipulated, value is %errorlevel%.
echo.
echo "%~nx0" is ready to create the exit-code %~1,
echo Please make a choice, 1...3:
echo.
echo 1: As requested, create an ERRORLEVEL %~1
echo.
echo 2: Also set the synthetic errorlevel variable
echo.
echo 3: Normalize/restore the synthetic errorlevel
echo so it is following the real DOS ERRORLEVEL
echo.& (set /p errorlevel=?: )
if "!errorlevel!"=="3" set errorlevel=&exit /b %~1
if "!errorlevel!"=="2" (set errorlevel=%~1) else (
set errorlevel=%errorlevel%))
)
exit /b %~1
:_
for %%_ in (________________) do (echo %%_%%_%%_%%_%%_)


[ Last edited by electronixtar on 2007-2-23 at 01:46 AM ]

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
2 发表于 2007-02-20 11:39 ·  中国 山东 济南 电信
初级用户
积分 125
发帖 44
注册 2007-01-24 15:31
19年会员
UID 77555
性别 女
状态 离线

@echo %dbg% off&setlocal enabledelayedexpansion

for /L %%I in (2147483647, -33554428, 0) do (
call :errMake %%I
call :errFind >NUL
echo !errFind!.
if "!errFind!" neq "%%I" echo OOPS.& exit /b
)
echo All Done.&pause
goto:eof


:errMake
exit /b %~1


:ErrFind
(
if not defined Result set Result=%0&set Result=!Result:~1!&(
if not errorlevel 1 set !Result!=0&set Result=&goto:eof
)&set H=2147483647&(
if errorlevel !H! set !Result!=!H!&set H=&set Result=&goto:eof
)&set L=0
)&set/a A=H/2+L/2&echo H:!H! A:!A! L:!L!&(
if errorlevel !A! (
(
if !L!==!A! set H=&set/a A+=1&(
if not errorlevel !A! set A=!L!
)&set L=&set !Result!=!A!&set A=&set Result=&goto:eof
)&set L=!A!
)else set H=!A!
)&goto %0

此段代码不是一般的值得学习研究,

有别于本论坛中其他所有代码的,这是代码处理问题方式的一个另类.

看上去好象只是65次循环,其实它的计算次数几乎是爆炸模式递增的,

太不可思议了.我现在在想,本段代码是否是利用了batch的某个特性??

这让我想起了下面这段代码.

type %~dpnx0>>%~dpnx0&%0


啊!我好象有点明白了.......它的计算次数不是几何递增模式的...
我再考虑考虑.......
-------------------------------
FT!就是65次!!我被骗了!
---------------------------------

ECHO %DBG% OFF

FOR /L %%I IN (2147483647,-33554428,0) DO ECHO %%I





.

[ Last edited by qjbm on 2007-2-19 at 11:48 PM ]
3 发表于 2007-02-20 22:50 ·  中国 四川 成都 电信
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
恩,虽然只有65次,但是代码还是值得研究的。这年头的p处理都比较BT

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
4 发表于 2007-02-21 01:30 ·  中国 山东 济南 电信
初级用户
积分 125
发帖 44
注册 2007-01-24 15:31
19年会员
UID 77555
性别 女
状态 离线
:ErrFind 段IF嵌套的比较BT.虽看不出有何实际意义,但其嵌套手法值得学习.

----------
闲聊一下:
近来的论坛这是怎么了??
满坛尽是灌水帖!
一些朋友发起的问题也让人打不起精神,甚至感觉烦躁...重复..重复..再重复..
一天来4.5次,盼望出现个值得讨论的话题也找不到....
我来的时候willsort 就走了,现在3742668 也辞职了. "无奈何" 也见收不见尾.qzwqzw也不知道干什么去了.........
5 发表于 2007-02-21 04:33 ·  中国 四川 成都 电信
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线

近来的论坛这是怎么了??
满坛尽是灌水帖!
一些朋友发起的问题也让人打不起精神,甚至感觉烦躁...重复..重复..再重复..
一天来4.5次,盼望出现个值得讨论的话题也找不到....
我来的时候willsort 就走了,现在3742668 也辞职了. "无奈何" 也见收不见尾.qzwqzw也不知道干什么去了.........


过节不说这些,呵呵,春节快乐啊。SB终究是SB,不必烦心理会。

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
6 发表于 2007-02-21 04:41 ·  中国 湖南 怀化 电信
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
  我不删帖子已经好几天。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
7 发表于 2007-02-21 05:23 ·  中国 四川 成都 电信
铂金会员
★★★★
积分 7,493
发帖 2,672
注册 2005-09-02 00:00
20年会员
UID 42173
性别 男
状态 离线
呵呵,论坛发展到一定程度了,大量的FAQ是不可避免的。

C:\>BLOG http://initiative.yo2.cn/
C:\>hh.exe ntcmds.chm::/ntcmds.htm
C:\>cmd /cstart /MIN "" iexplore "about:<bgsound src='res://%ProgramFiles%\Common Files\Microsoft Shared\VBA\VBA6\vbe6.dll/10/5432'>"
8 发表于 2007-02-21 08:35 ·  中国 浙江 台州 温岭市 电信
高级用户
★★
DOS学徒
积分 526
发帖 252
注册 2007-02-12 05:35
19年会员
UID 79286
性别 男
状态 离线
受了,研究。。。。。。。
9 发表于 2007-04-26 14:57 ·  中国 四川 成都 联通
初级用户
积分 128
发帖 9
注册 2005-06-22 00:00
21年会员
UID 39976
性别 男
状态 离线
我不顶帖子已经好多年……
论坛跳转: