1

私のコードは次のとおりです。マイクロソフトのVBAのコンパイラは何もしない手続きへの呼び出しをネイティブVBAコンパイラは最適化していますか?次のように

#Const debuggingEnabled = False 

Sub debugMessage(str As String) 
    #If debuggingEnabled Then 
     Debug.Print str 
    #End If 
End Sub 

Sub doThings() 
    debugMessage "test" 'Does this get optimised away, or must it be explicitly 
          'wrapped with `#If .. #End If` every time it's called 
          'if one is to avoid the jump and stack push/pop ops? 
End Sub 

離れて最適化していますか?どうすればわかりますか?

+0

ブーリアンテストの1ビット1ビットバイナリを「最適化」する際のポイントは何ですか?これが実行時間のかなりの部分を占めていると確信していますか?可能かもしれませんが、チャンスはかなり遠いです。最適化する前に、いくつかのプロファイリングを行います。したがって、実行時間の0.0001%に相当するコードを心配する必要はありません。 –

+0

@ Jean-FrançoisCorbett:何千回も繰り返されるループ中にいくつかのデバッグ出力を出したいのですが、デバッグが無効な場合は、その後のジャンプ/スタック操作のオーバーヘッドが避けられます。そのような呼び出しに伴う追加のオーバーヘッドの量を判断するためにVBAをプロファイルするにはどうすればよいですか? – eggyal

答えて

1

シングル、1ビット、バイナリ、ブールテストを含む手順を「離れて最適化」のポイントは何ですか?これが実行時間のかなりの部分を占めていると確信していますか?その可能性はかなり遠いです。

最適化を行う前に、常にプロファイリングを行ってください。時間を無駄にせず、実行時間の0.0001%に相当するコードを心配しないでください。

VBAにはネイティブプロファイラはありませんが、そこにはサードパーティのオプションがあり、その中にはいくつかのものがあります。これは、教訓的な読み:Profiling and Optimizing VBA By bruce mcphersonを伴うものです。 DuckDuckGo searchは、多くの他のリードも与える。

あなたの元の質問に対する答えは、私はVBAがそのような手続きを最適化するとは思っていませんが、私は完全にはわかりませんし、いずれにせよ完全に無関係です。最適化を心配する前に、常にプロファイリングを行ってください。時間を賢く過ごすことができます。プロファイリングの後、ほとんどの場合、プログラムを遅くすると思ったことは、実際には非常に速く、何かが原因です。

1

AFAIK VBAインタプリタはほとんど最適化を行いません。これをVBEのデバッグモードでテストすると、実行が「空の」サブにジャンプすることがわかります。 しかし、私はVBAの残りの実行によってオーバーヘッドが増えてしまうと考えていました。答えにコメントから、このアップグレード

+1

デバッグ時にどのような最適化が行われるのかをテストすると、ダイスを投げるほど重要です。(cコンパイラは明らかにそのようなことを最適化しますが、デバッグ時にそのようなメソッドを入力することはできます)生成されたネイティブコードが確実であることを期待しなければならないし、VBAでそれをどうやってやるのか分からない(おそらくそれは大したことではない) – Voo

+0

VBAにはデバッグビルドがなく、生成するネイティブコードは生成されない。 VBAインタプリタ(単語の伝統的な意味でのコンパイラではない)を変更しない式からループを取り除くなどの明白なことについてのタイミングテストで判断すると、ほとんど最適化が行われません。 –

関連する問題