2013-10-22 73 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批處理文件解析器!)這個程序仍然沒用:正如我在其他答案中所說的,重命名批處理文件中的變量對性能影響很小。我只寫了它的樂趣!

相關問題