2

我有一些使用 VBA 来解析 word 文档并构建一些 XML 输出的遗留代码;

不用说它像狗一样奔跑,但我有兴趣分析它以查看它在哪里发生故障,也许是否有一些选项可以让它更快。

在我开始测量我的结果之前,我不想尝试任何事情,所以分析是必须的——我已经做了一些搜索,但找不到任何可以轻松完成这项工作的东西。布伦特伍德有一种工具吗?这需要修改你的代码,但它没有工作,我跑了一段时间。

任何人都知道任何简单的工作?

更新:代码库大约有 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

插入一堆

Debug.Print "before/after foo", Now

在您认为可能会长期运行的片段之前和之后,然后将它们进行比较,瞧,您就在那里。

于 2008-10-28T14:31:05.713 回答
0

我的建议是分而治之,通过在几个关键位置插入一些时间线来尝试隔离问题,然后深入研究该区域。

如果问题更加分散且不明显,我建议通过逐步禁用整个代码块来简化,尽可能不破坏流程。这类似于通过逐步对工作表或工作表的部分进行硬编码,直到速度问题消失,才能在 Excel 工作簿中找到减速带。

于 2008-10-29T07:54:23.500 回答
0

关于那个“现在”功能(上图,svinto)......

我使用了“ Timer ”函数(在 Excel VBA 中),它返回一个 Single。它似乎工作得很好。拉里

于 2009-01-14T18:17:19.653 回答