2011-06-05 13 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

相關問題