与COM对象的后期绑定(flexgrid)比早期绑定慢2倍

时间:2018-07-24 05:57:50

标签: vb6 msflexgrid

Public Function gridloop(MSFG1 As Object) As Long
     For  i= 0 To MSFG1.rows - 1 
            A = MSFG1.TextMatrix(i,1)
        Next
End Function

上面的代码比下面的代码慢2倍

Public Function gridloop(MSFG1 As MSHFlexGrid) As Long
Public Function gridloop(MSFG1 As MSFlexGrid) As Long

有加速解决方案吗?

3 个答案:

答案 0 :(得分:3)

问题中没有很多细节,我想您有两个(或更多?)不同的控件,您实际上要在其中重载gridloop函数,以便可以与多种控件一起使用?

以下内容可能会改善性能。我没有测试过它,甚至没有确认它没有编译错误。想法是确定控件类型,然后将其分配给匹配类型的变量,然后对方法和属性的引用可能会被早期绑定(因此速度更快)。

Public Function gridloop(MSFG1 as Object) as Long
  Dim myMSHFlexGrid As MSHFlexGrid
  Dim myMSFlexGrid As MSFlexGrid
  Dim i As Integer
  Dim A As Long

  If TypeOf MSFG1 Is MSHFlexGrid Then
    Set myMSHFlexGrid = MSFG1 
    For  i = 0 To myMSHFlexGrid.rows - 1 
      A = myMSHFlexGrid.TextMatrix(i,1)
    Next
  ElseIf TypeOf MSFG1 Is MSFlexGrid Then
    Set myMSFlexGrid = MSFG1 
    For  i = 0 To myMSFlexGrid.rows - 1 
      A = myMSFlexGrid.TextMatrix(i,1)
    Next
  End If

End Function

替代方法是定义两个gridloop函数,每种类型一个。手动重载的一种形式。

Public Function gridloop_MSHFlexGrid(MSFG1 As MSHFlexGrid) As Long
Public Function gridloop_MSFlexGrid(MSFG1 As MSFlexGrid) As Long

此方法的优点在于,尝试使用“错误”控件调用gridloop函数之一将导致编译错误-尽早发现问题,否则可能需要花费大量时间进行运行时调试。 / p>

答案 1 :(得分:1)

基于MarkL's answer,您可以使用实际的VB接口重载来获取所需的内容。

这个想法是创建一个接口,在网格上公开您需要的任何属性或功能,然后创建两个类,每个类实现该接口并在内部操作实际的网格。

此包装替代了以下事实:两个网格类型本质上不共享公共接口。 (我使用OLEView查看了IDL)。

然后,您可以在当前使用Object代表实际网格类的每个位置中,将界面用作类型。如果该接口是全面的,并且其方法/属性已适当命名,则您无需进行任何其他代码更改。

样本(伪)代码...

接口:

'In file for interface IGridWrapper

Function Rows
End Function

Function TextMatrix(i as Integer, j as Integer)
End Function

'Any others...

包装类1:

' In file for class "MSFlexGridWrapper"

Implements IGridWrapper

Private m_grid as MSFlexGrid

Sub Init(MSFlexGrid grid)
  Set m_grid = grid
End Sub

Function IGridWrapper_Rows
   IGridWrapper_RowCount = m_grid.Count
End Function

Function IGridWrapper_Textmatrix(i as Integer, j as Integer)
   'etc.
End Function

'Any others...

包装类2:

' In file for class "MSHFlexGridWrapper"

Implements IGridWrapper

Private m_grid as MSHFlexGrid

Sub Init(MSHFlexGrid grid)
  Set m_grid = grid
End Sub

Function IGridWrapper_Rows
   IGridWrapper_RowCount = m_grid.Count
End Function

Function IGridWrapper_Textmatrix(i as Integer, j as Integer)
   'etc.
End Function

'Any others...

使用包装程序的代码:

Public Function gridloop(MSFG1 As IGridWrapper) As Long

(注意-这些都没有通过编译器进行精确的语法检查)

答案 2 :(得分:1)

后期绑定(在运行时绑定)比早期绑定(在编译时绑定)慢的根本原因是,您必须使用iDispatch接口的GetIDsOfNamesInvoke方法访问对象界面中的属性,而不是直接从vtable访问属性。有关更多信息,请查看this

DaveInCaz和MarkL的建议可能会加快速度的原因是,它们是允许gridloop函数接受可以早期绑定的类型而不是Object类型的方法。 DaveInCaz的解决方案也是多态性实际应用的一个很好的例子。