2013-10-22 42 views
3

所以你知道,当人们编写代码时,他们做得很整齐,最好看,也是最容易理解的。但有没有批处理的优化器?有人能做一个吗?有没有批处理代码优化器这样的事情?

示例 - 它需要现有的变量,并用最短的变种

set whatever=whatever 
echo question 
set /p answer=: 
if %answer%=%whatever% whatever 

取代他们,把它变成

set a=whatever 
echo question 
set /p b=: 
if %b%=%a% whatever 

因此,它基本上缩短了变量,标志(或标签或任何像:顶部),并做其他事情我不能基本上优化一切。

+3

如果你克服了你会遇到的问题,它会把一个写得很好的批处理文件变成一段难以阅读的代码,没有任何好处。如果将批处理文件大小减少2 KB,那么硬盘驱动器上的簇大小通常会超过8 KB,而且此类批处理文件的运行速度不会超过任何合理的基准。这将是一个有趣的(也可能令人沮丧的)练习。 :) – foxidrive

回答

1

批处理程序中存在某些构造会减慢执行速度。唯一对此有重大影响的结构是通过GOTO组装一个循环,而不是任何类型的FOR命令。如果用FOR命令重写包含许多GOTO的大型程序,则可以节省大量时间。影响这一点的另一个方面是程序所具有的命令/行的数量,也就是说,得到的结果比具有较少行的另一个结果的程序运行得更快。用较少的命令实现相同的事情的方法是充分利用批处理文件功能。

例如,下面的代码:

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% 

缩短变量名在执行速度非常小的影响。

这样,最好的选择是从一开始就使用这些技术编写批处理文件。有没有简单的方法来开发一个程序,读取批处理文件并执行以前的更改,即用FOR替换GOTO,并将少数几行中的数行“压缩”。

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命令删除,然后再将其传递到此程序。当然,这个细节可能会导致几个陷阱:虽然被调用的程序已经启用了Delayed Expansion,但是没有办法激活批处理文件为了正确运行而可能需要的任何禁用/启用延迟扩展。此外,程序更改批处理文件中的所有字符串等于任何变量名称,但即使此点可以修复(并且这是一个大IF,因为它需要模拟cmd.exe批处理文件解析器!)这个程序仍然没用:正如我在其他答案中所说的,重命名批处理文件中的变量对性能影响很小。我只写了它的乐趣!

相关问题