所以你知道,当人们编写代码时,他们会整洁,最好看并且最容易理解。但批量是否有优化器?有人可以做一个吗?
例 - 它需要现有的变量并用最短的变量替换它们
set whatever=whatever
echo question
set /p answer=:
if %answer%=%whatever% whatever
并将其变为
set a=whatever
echo question
set /p b=:
if %b%=%a% whatever
所以它基本上缩短了变量,标志(或标签或类似的东西:top),并做了其他我不能做的事情来基本上优化一切。
答案 0 :(得分:1)
批处理程序中有某些构造会降低执行速度。对此有重大影响的唯一构造是通过GOTO
而不是任何类型的FOR
命令组装循环。如果使用GOTO
命令重写具有许多FOR
的大型程序,则需要节省大量时间。影响这一点的另一个方面是程序具有的命令/行数,也就是说,与具有较少行的另一个程序获得相同结果的程序将运行得更快。使用较少命令实现相同功能的方法是充分利用批处理文件功能。
例如,此代码:
set /A b=a+8
set /A c=b*2
set /A d=c+e
......比这个跑得慢:
set /A b=a+8, c=b*2, d=c+e
此代码:
command-that-return-errorlevel
if %errorlevel% equ 1 goto label-1
if %errorlevel% equ 2 goto label-2
if %errorlevel% equ 3 goto label-3
......比这个跑得慢:
command-that-return-errorlevel
for %%e in (1 2 3) do if %errorlevel% equ %%e goto label-%%e
...之前的一个比这个慢一点:
command-that-return-errorlevel
goto label-%errorlevel%
缩短变量名对执行速度的影响非常小。
这样,最好的选择是从一开始就使用这些技术编写批处理文件。没有简单的方法来开发一个读取批处理文件并执行先前更改的程序,即用GOTO
替换FOR
并用少量的几行“压缩”几行。
答案 1 :(得分:0)
以下程序只是为了好玩!
@echo off
setlocal EnableDelayedExpansion
rem Get a list of current variable names
(for /F "delims==" %%v in ('set') do (
echo %%v
)) > varnames.txt
rem Call the Batch file, so it creates its variables
call "%~1"
rem Create an array with new variable names
set "_numVars="
set "_nextVar="
< varnames.txt (for /F "delims==" %%v in ('set') do (
if not defined _nextVar set /P _nextVar=
if "%%v" neq "!_nextVar!" (
set /A _numVars+=1
set "var[!_numVars!]=%%v"
) else (
set "_nextVar="
)
))
del varnames.txt
rem Rename the variables in a new file
setlocal DisableDelayedExpansion
(for /F "delims=" %%a in ('findstr /N "^" "%~1"') do (
set "line=%%a"
setlocal EnableDelayedExpansion
set "line=!line:*:=!"
if defined line (
for /L %%i in (1,1,%_numVars%) do (
for /F "delims=" %%v in ("!var[%%i]!") do set "line=!line:%%v=v%%i!"
)
)
echo(!line!
endlocal
)) > "%~1.new"
该程序从参数中给出的批处理文件中获取所有变量,并将它们重命名为带有序号的“v#”。要使用此程序,必须先从批处理文件中删除任何setlocal
命令,然后再将其传递给此程序。当然,这个细节可能会导致一些陷阱:虽然被调用的程序已经启用了延迟扩展,但是没有办法激活批处理文件可能需要的任何禁用/启用延迟扩展才能正确运行。此外,程序更改批处理文件中所有字符串等于任何变量名称,但即使这一点可以修复(这是一个很大的IF,因为它需要模拟cmd。 exe批处理文件解析器!)这个程序仍然没用:正如我在其他答案中所说,重命名批处理文件中的变量对其性能影响很小。我只是为了好玩而写的!