将一个大型实例方法移动到shared,并创建一个实例存根——这是个好主意



快速问题:如果我在一个实例方法(即不是Shared)类中有一个非常大的函数/子,那么通过将其移动到共享方法,然后为实例使用声明一个小的存根方法,我会得到或失去什么吗?

也就是说,我从这个开始:

Public Sub MyBigMethod(ByVal Foobar As String)
    If String.IsNullOrWhitespace(Foobar) Then
        Throw New ArgumentNullException("Foobar")
    End If
    ' Lots and lots of ugly code.
    ' Really.  There is lots of ugly code here.
    '
    ' Lorem ipsum dolor sit amet, consectetur adipiscing
    ' elit. Aliquam vel erat sit amet massa ultricies
    ' adipiscing. Mauris eu est ligula, a pharetra lorem.
End Sub



到此:

Private Shared Sub MyBigMethod(ByVal Obj as MyObj, ByVal Foobar As String)
    ' Lots and lots of ugly code.
    ' Really.  There is lots of ugly code here.
    '
    ' Lorem ipsum dolor sit amet, consectetur adipiscing
    ' elit. Aliquam vel erat sit amet massa ultricies
    ' adipiscing. Mauris eu est ligula, a pharetra lorem.
End Sub
Public Sub MyBigMethod(ByVal Foobar As String)
    If String.IsNullOrWhitespace(Foobar) Then
        Throw New ArgumentNullException("Foobar")
    End If
    Call MyClass.MyBigMethod(Me, Foobar)
End Sub

我的想法是,我节省了每个对象实例的内存大小。因为每个实例只需要绕过stub方法,该方法处理调用共享版本并将自己的实例传递给共享方法,这样它就可以做任何需要做的事情。但我敢打赌,由于增加了函数调用开销,我牺牲了很小的速度。

正确吗?

我的想法是,我节省了每个对象实例的内存大小。

这是不正确的,因为每个实例都没有将方法存储在内存中。实例方法只在内存中存储一次。函数指令不同于类成员(按实例存储)。

此外,添加函数调用会带来一些损失,因为在调用共享方法时必须保存存根方法的状态。然后,必须在共享方法终止时将其加载回。(注意:这与进行任何非内联函数调用时的惩罚相同;随着参数数量和大小的增加,惩罚变得更加严厉)

您遵循了一条逻辑思路,但它是基于这样一个假设,即每个实例都有自己的逻辑指令——当它们实际用于一个类的所有实例时。

相关内容

最新更新