有没有批处理代码优化器这样的东西?

时间:2013-10-22 03:02:22

标签: batch-file optimization filesize

所以你知道,当人们编写代码时,他们会整洁,最好看并且最容易理解。但批量是否有优化器?有人可以做一个吗?

例 - 它需要现有的变量并用最短的变量替换它们

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),并做了其他我不能做的事情来基本上优化一切。

2 个答案:

答案 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批处理文件解析器!)这个程序仍然没用:正如我在其他答案中所说,重命名批处理文件中的变量对其性能影响很小。我只是为了好玩而写的!