【问题标题】:Profiling VBA code for microsoft word分析 Microsoft Word 的 VBA 代码
【发布时间】:2010-09-19 14:23:47
【问题描述】:

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

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

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

有谁知道任何简单有效的方法?

更新:代码库大约有 20 个左右的文件,每个文件至少有 100 个方法 - 为每个方法手动添加开始/结束调用是不合适的 - 特别是之后将它们全部删除 - 我实际上正在考虑做某种形式的正则表达式来解决这个问题,另一种形式是在之后将它们全部删除,但这有点过于侵入性,但可能是唯一的解决方案。我之前在这里找到了一些不错的计时代码,因此其中的计时部分不是问题。

【问题讨论】:

    标签: vba optimization profiling ms-word


    【解决方案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
    

    在项目属性中将 条件编译参数 设置为:

    PROFILE = 1
    

    删除正常、非配置版本的行。

    添加行很痛苦,我不知道有什么方法可以自动获取当前方法名称,这样可以轻松地将分析行添加到每个函数中。您可以使用 VBE 对象模型为您注入代码 - 但我想知道手动执行此操作最终会更快。

    【讨论】:

      【解决方案2】:

      可以使用模板在每个过程中添加一行:

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

      错误处理程序模板通常包含一些描述的 ExitHere 标签。标签之后的第一行可能是计时器打印。

      也可以通过代码修改代码:"Example: Add some lines required for DAO" 是一个 Access 示例,但类似的事情可以用 Word 来完成。

      希望这会缩小搜索问题的范围。然后可以注释掉该行,或者您可以恢复为备份。

      【讨论】:

        【解决方案3】:

        插入一堆

        Debug.Print "before/after foo", Now
        

        您认为可能会长期运行的 sn-ps 之前和之后,然后将它们进行比较,瞧,您就是这样。

        【讨论】:

        • 这可能是唯一的解决方案。这可能不是你最想听到的。但是 MSWord 中的 VBA 并不是最好的 IDE。在有人提出更好的答案之前,我赞成这个。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          关于“Now”功能(上图,svinto)...

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-10-15
            • 1970-01-01
            • 2019-01-30
            • 1970-01-01
            • 2011-07-30
            • 2015-07-13
            • 2021-09-25
            • 2017-04-17
            相关资源
            最近更新 更多