Профилирование кода VBA для Microsoft Word - PullRequest
2 голосов
/ 28 октября 2008

У меня есть какой-то устаревший код, который использует VBA для синтаксического анализа текстового документа и создания вывода XML;

Само собой разумеется, что он работает как собака, но мне было интересно его профилировать, чтобы увидеть, где он ломается и, возможно, есть ли варианты, чтобы сделать его быстрее.

Я не хочу ничего пробовать, пока не начну измерять свои результаты, поэтому профилирование является обязательным - я немного искал, но не могу найти ничего, что могло бы легко выполнить эту работу. Был один инструмент от Brentwood? это требует изменения вашего кода, но это не сработало, и я запустил время.

Кто-нибудь знает что-нибудь простое, что работает?

Обновление: база кода составляет около 20 или около того файлов, каждый из которых содержит не менее 100 методов - вручную добавлять начальные / конечные вызовы для каждого метода просто неуместно - особенно после их удаления - я на самом деле думал о том, чтобы сделать какая-то форма REGEX для решения этой проблемы, а другая - для удаления их всех после, но это немного слишком навязчиво, но может быть единственным решением. Ранее я нашел здесь хороший временный код, поэтому временная часть его не представляет проблемы.

Ответы [ 5 ]

1 голос
/ 28 октября 2008

Может быть возможно использовать шаблон для добавления строки к каждой процедуре:

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

Шаблоны обработчика ошибок обычно содержат метку ExitHere некоторого описания. Первая строка после метки может быть печатью по таймеру.

Также возможно изменить код с помощью кода: "Пример: добавить несколько строк, необходимых для DAO" - это пример доступа, но нечто подобное можно было бы сделать с Word.

Это, надеюсь, сузит область поиска проблем. Строка может быть закомментирована, или вы можете вернуться к резервным копиям.

1 голос
/ 28 октября 2008

Использование класса и #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, чтобы внедрить код для вас, но мне интересно, что делать это вручную будет в конечном итоге быстрее.

0 голосов
/ 14 января 2009

Об этой функции " Now " (выше, svinto) ...

Я использовал функцию " Timer " (в Excel VBA), которая возвращает Single. Кажется, работает просто отлично. Ларри

0 голосов
/ 29 октября 2008

Мое предложение состояло бы в том, чтобы разделить и победить, вставив некоторые временные линии в несколько ключевых мест, чтобы попытаться изолировать проблему, а затем углубиться в эту область.

Если проблема более распространена и неочевидна, я бы предложил упростить ее путем постепенного отключения целых кусков кода по одному, насколько это возможно, без прерывания процесса. Это аналогия нахождения скачков скорости в рабочей книге Excel с помощью постепенного жесткого кодирования листов или частей листов, пока проблема со скоростью не исчезнет.

0 голосов
/ 28 октября 2008

Вставьте связку

Debug.Print "before/after foo", Now

до и после фрагментов, которые, по вашему мнению, могут работать долго, затем просто сравните их и вуаля.

...