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

所以它基本上缩短了变量、标志(或标签或任何类似的东西:top)并做其他我无法做的事情来基本上优化一切。

4

2 回答 2

1

批处理程序中有某些结构会减慢执行速度。对这一点产生重大影响的唯一构造是通过 aGOTO而不是任何类型的FOR命令组装一个循环。GOTO如果使用命令重写具有多个 's 的大型程序,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%

缩短变量名对执行速度的影响很小。

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

于 2013-10-22T19:50:49.203 回答
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 批处理文件解析器!)这个程序仍然是无用的:因为我在另一个答案中说过,重命名批处理文件中的变量对其性能影响很小。我只是为了好玩才写的!

于 2013-10-23T03:22:48.020 回答