2011-06-05 14 views
1

快速问题:如果我有一个非常大的函数/子类是一个实例方法(即不是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方法,并将其自身的实例传递给共享方法,以便它可以执行任何需要的操作。但我敢打赌,由于额外的函数调用开销,我牺牲了非常多的速度。

对不起?

回答

2

我的想法是保存每个对象实例的内存大小。

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

此外,通过添加函数调用,您会获得一点处罚,因为在调用共享方法时必须保存存根方法的状态。然后,当共享方法终止时,它必须被加载回去。 (注意:这是您在进行任何非内联函数调用时所采取的相同处罚;随着参数的数量和大小的增加,惩罚会变得更加僵硬)

您沿着一条逻辑思路走下去,但它是基于假设每个实例都有自己的逻辑指令 - 当它们实际用于类的所有实例时。

+0

听起来有点像中断处理程序如何在CPU级别工作。它只是保存刚刚中断的线程状态,然后在返回之前恢复它们。所以如果我的假设是错误的,那么通过将一个大功能作为一个共享方法,没有任何东西可以获得? – Kumba 2011-06-05 06:06:11

+0

@ hamlin11:Re,第三段:共享方法对类有什么好处?仅适用于处理不需要直接对类的实例变量进行操作的实用程序方法的情况? – Kumba 2011-06-05 06:09:17

+1

实际上,共享方法会导致一些线程安全问题。就CPU而言,共享和实例方法之间没有区别。这只是汇编语言指令。在将程序提交到程序集之前,编译器确定谁可以访问这些指令。 – 2011-06-05 06:11:46

相关问题