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

バッチ プログラムには、実行速度を低下させる特定の構成要素があります。この点に大きな影響を与える唯一の構造は、コマンドのGOTO代わりにa を介してループを組み立てることです。FORの多い大規模なプログラムをコマンドでGOTO書き直すと、大幅FORな時間の節約が期待できます。この点に影響を与えるもう 1 つの側面は、プログラムに含まれるコマンド/行の数です。つまり、行数の少ない別のプログラムよりも同じ結果が得られるプログラムは、より高速に実行されます。より少ないコマンドで同じことを達成する方法は、バッチ ファイル機能をうまく利用することです。

たとえば、次のコード:

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%

変数名を短くしても、実行速度にはほとんど影響しません。

このように、最良のオプションは、最初からこれらの手法を使用してバッチ ファイルを作成することです。バッチ ファイルを読み取り、以前の変更を実行するプログラムを開発する簡単な方法はありませ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このプログラムを使用するには、コマンドをこのプログラムに渡す前に、バッチ ファイルからコマンドを削除する必要があります。もちろん、この詳細はいくつかの落とし穴を引き起こす可能性があります: 呼び出されたプログラムは遅延拡張を既に有効にしていますが、正しく実行するためにバッチ ファイルが必要とする遅延拡張の無効化/有効化を有効にする方法はありません。その上、プログラムはすべての文字列を変更します任意の変数名に等しいバッチ ファイルでは、しかし、この点を修正できたとしても (cmd.exe バッチ ファイル パーサーをエミュレートする必要があるため、これは大きな IF です!)、このプログラムはまだ役に立たないでしょう: as他の回答で、バッチ ファイル内の変数の名前を変更しても、そのパフォーマンスにはほとんど影響がないと述べました。趣味で書きました!

于 2013-10-23T03:22:48.020 に答える