2008-10-28 2 views
2

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

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

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

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

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

ответ

1

Использование класса и #if бы сделать это "добавив код для каждого метода" немного легче ...

Profiler Класс модуля::

#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 

В Прое CT Properties установить условной компиляции Аргументы в:

PROFILE = 1 

Удалить линию для обычных, не профилированных версий.

Добавление линий - это боль, я не знаю, как автоматически получить имя текущего метода, что упростит добавление линии профилирования к каждой функции.Вы можете использовать объектную модель VBE для ввода кода для вас - но я думаю, что делать это вручную будет в конечном счете быстрее.

0

Вставьте кучу

Debug.Print "before/after foo", Now 

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

+0

Это может быть единственным решением. Вероятно, это не то, что вы хотите услышать. Но VBA в MSWord на самом деле не лучшая IDE. Пока кто-то не придумает лучшего ответа, я буду поддерживать это. – Kibbee 2008-10-28 14:50:36

1

Это может быть возможным использовать шаблон, чтобы добавить строку в каждую процедуру:

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

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

Также можно изменить код с помощью кода: "Example: Add some lines required for DAO" - это пример доступа, но что-то подобное можно сделать с помощью Word.

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

0

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

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

0

О том, что функция "Теперь" (выше, svinto) ...

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

Смежные вопросы