1

私のコードは次のとおりです。

#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

MicrosoftのVBAコンパイラは、何もしないプロシージャへの呼び出しを最適化しますか?どうすればわかりますか?

4

2 に答える 2

1

これをコメントから回答にアップグレードする:

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

最適化する前に、常にプロファイリングを行ってください。そうすれば、時間を無駄にせず、実行時間の0.0001%に相当するコードのビットについて心配する必要がありません。

VBAにはネイティブプロファイラーはありませんが、サードパーティのオプションがあり、その一部は無料です。これは、有益な読み物を伴うものです:brucemcphersonによるVBAのプロファイリングと最適化DuckDuckGo検索では、他にもたくさんのリードがあります。

したがって、元の質問に対する答えは次のとおりです。VBAがそのような手順を最適化するとは思わないが、完全にはわからない。どちらにしても、おそらく完全に無関係である。最適化について心配する前に、常にプロファイリングを行ってください。そうすれば、時間を賢く使うことができます。プロファイリング後、ほとんどの場合、プログラムの速度が低下したと思ったことが実際には非常に高速であり、他の何かが原因であることがわかります。

于 2012-04-06T12:20:36.823 に答える
1

AFAIK VBAインタープリターは、最適化をほとんどまたはまったく行いません。これをVBEデバッグモードでテストすると、実行が「空の」サブにジャンプすることがわかります。しかし、VBAの残りの実行によって、追加のオーバーヘッドがとにかく溺れると思いました。

于 2012-04-05T13:40:47.377 に答える