2

VBAを使用して単語ドキュメントを解析し、XML出力を構築するレガシーコードがいくつかあります。

言うまでもなく、犬のように動作しますが、どこで故障しているのか、そしておそらくそれをより速くするためのいくつかのオプションがあるかどうかを確認するためにプロファイリングすることに興味がありました。

結果の測定を開始できるようになるまで何も試したくないので、プロファイリングは必須です-少し検索しましたが、この仕事を簡単に行うものを見つけることができません。ブレントウッドの道具は1つありましたか?コードを変更する必要がありますが、機能せず、時間がなくなりました。

誰もがうまくいく簡単なことを知っていますか?

更新:コードベースは約20ほどのファイルで、それぞれに少なくとも100のメソッドがあります-各メソッドの開始/終了呼び出しを手動で追加することは適切ではありません-特に後でそれらをすべて削除します-私は実際に何らかの形で行うことを考えていましたこの問題を解決するための正規表現と、後でそれらをすべて削除するための正規表現ですが、少し煩わしいですが、唯一の解決策である可能性があります。私は以前にここでいくつかの素晴らしいタイミングコードを見つけたので、それのタイミング部分は問題ではありません。

4

5 に答える 5

1

テンプレートを使用して、各プロシージャに行を追加できる場合があります。

http://msdn.microsoft.com/en-us/library/aa191135(office.10).aspx

エラーハンドラテンプレートには通常、説明のExitHereラベルが含まれています。ラベルの後の最初の行はタイマー印刷である可能性があります。

コードを介してコードを変更することもできます。「例:DAOに必要な行をいくつか追加する」はAccessの例ですが、Wordでも同様のことができます。

これにより、問題を探すために領域を絞り込むことができれば幸いです。その後、その行をコメントアウトするか、バックアップに戻すことができます。

于 2008-10-28T16:21:25.117 に答える
1

クラスと #if を使用すると、「各メソッドにコードを追加する」ことが少し簡単になります...

プロファイラークラス モジュール: :

#If PROFILE = 1 Then

Private m_locationName As String
Private Sub Class_Initialize()
    m_locationName = "unknown"
End Sub

Public Sub Start(locationName As String)
    m_locationName = locationName
    MsgBox m_locationName
End Sub

Private Sub Class_Terminate()
    MsgBox m_locationName & " end"
End Sub

#Else

Public Sub Start(locationName As String)
 'no op
End Sub

#End If

他のコード モジュール:

' helper "factory" since VBA classes don't have ctor params (or do they?)
Private Function start_profile(location As String) As Profiler
    Set start_profile = New Profiler
    start_profile.Start location
End Function

Private Sub test()
    Set p = start_profile("test")
    MsgBox "do work"
    subroutine
End Sub

Private Sub subroutine()
    Set p = start_profile("subroutine")
End Sub

プロジェクトのプロパティで、条件付きコンパイル引数を次のように設定します。

PROFILE = 1

通常のプロファイルされていないバージョンの行を削除します。

行を追加するのは面倒です。現在のメソッド名を自動的に取得して、各関数にプロファイリング行を簡単に追加する方法がわかりません。VBE オブジェクト モデルを使用してコードを挿入することもできますが、これを手動で行った方が最終的には高速になるのではないかと思います。

于 2008-10-28T17:13:42.593 に答える
0

私の提案は、いくつかの重要な場所にいくつかのタイミング ラインを挿入して問題を切り分けようとすることによって、分割して征服し、その領域をドリルダウンすることです。

問題がより拡散していて明らかでない場合は、プロセスを中断せずに可能な限り、コードのチャンク全体を一度に 1 つずつ徐々に無効にすることで簡素化することをお勧めします。これは、速度の問題がなくなるまで、シートまたはシートの一部を徐々にハード コーディングすることによって、Excel ワークブックで速度の問題を見つけることに例えられます。

于 2008-10-29T07:54:23.500 に答える
0

その「Now」機能について(上記、svinto)...

シングルを返す「タイマー」関数(Excel VBA)を使用しました。それはうまくいくようです。ラリー

于 2009-01-14T18:17:19.653 に答える
0

一杯入れる

Debug.Print "before/after foo", Now

長期的に実行される可能性があると思われる前後のスニペットを比較してみてください。

于 2008-10-28T14:31:05.713 に答える