2015-05-09 46 views
2

我正在研究單例格式,它與我之前使用的東西非常相似。N靜態字段與單個靜態實例

我的問題是,這兩種方法之間是否存在任何不同的內存和/或性能方面的差異,第二種方法是否更快,足以掩蓋其用法更大的寫入和讀取?

下面是一個例子代碼:

方法1

public static class TheSomething { 
    public static String Title; 
    public static String Description; 
    public static String HowIsIt; 
    public static int TimesSeenCount; 
    public static List<Long> PeopleWhoSawIt; 
    public static List<Session> PeopleSeeingIt; 

    // now some math mumbo jumbo just to increase the memsize of this: 
    public static double posX; 
    public static double posY 
    public static double posZ; 
    public static double velX; 
    public static double velY; 
    public static double velZ; 
    public static double accX; 
    public static double accY; 
    public static double accZ; 
    public static double rotX; 
    public static double rotY; 
    public static double rotZ; 
    public static double rotVelX; 
    public static double rotVelY; 
    public static double rotVelZ; 
    public static double rotAccX; 
    public static double rotAccY; 
    public static double rotAccZ; 
    public static List<Vertex> Geometry; 
} 

要用於:

++TheSomething.PeopleWhoSawIt; 

方法2

public static class TheSomething { 
    private static TheSomething _instance; 
    public static Instance { 
     get { 
      if(_instance == null) 
       _instance = new TheSomething(); 
     } private set { 
      _instance = value; 
     } 
    } 
    private TheSomething() {} 
    public String Title; 
    public String Description; 
    public String HowIsIt; 
    public int TimesSeenCount; 
    public List<Long> PeopleWhoSawIt; 
    public List<Session> PeopleSeeingIt; 

    // now some math mumbo jumbo just to increase the memsize of this: 
    public double posX; 
    public double posY 
    public double posZ; 
    public double velX; 
    public double velY; 
    public double velZ; 
    public double accX; 
    public double accY; 
    public double accZ; 
    public double rotX; 
    public double rotY; 
    public double rotZ; 
    public double rotVelX; 
    public double rotVelY; 
    public double rotVelZ; 
    public double rotAccX; 
    public double rotAccY; 
    public double rotAccZ; 
    public List<Vertex> Geometry; 
} 

要用於:

++TheSomething.Instance.PeopleWhoSawIt; 
+1

這是一個非常複雜的問題,我的答案是人們比我更聰明的話。請閱讀SO冠軍Jon Skeet的文章[在C#中實現Singleton模式](http://csharpindepth.com/articles/general/singleton.aspx)。 – CrnaStena

+0

「是否更快」是一種只能由_you_回答的問題,方法是在實際情況下運行與您的實際場景類似的有效性能測試。你的例子沒有什麼意義(增加一個'List '的實例?),但是如果有什麼我會期望靜態類比單例更快(可能是一些無關緊要或甚至不可估量的量)。充其量,這裏的問題太廣泛了,最壞的情況是沒有足夠的信息讓任何人回答你的具體情況。 –

回答

1

性能方面也不選項將爲您提供一個實質性的改善。它們屬於微觀優化的範圍,不會在現實世界的場景中產生太多(如果有的話)差異。

從設計的角度來看,這兩個選項都非常糟糕,第一個選項特別邪惡。一般來說,單身模式是令人fr目結舌的,因爲開發人員傾向於濫用和忽視與其相關的各種副作用,例如緊貼內存或資源或缺乏多線程支持。

如果您仍然需要該類的單個實例,請嘗試查看使用依賴注入容器,而不是將該類設計爲單例。

+0

是的,我最終需要一些類來「僅僅執行一些東西」或「只存儲這些全局使用的信息」,比如System.Convert,但是我也可能需要在這些類中存儲一些值,例子似乎適合於這個目的。假設沒有性能差異,那麼我會假設第一個模型(通常甚至被框架本身使用)似乎更適合。並同意我看不到使用單身人士的好理由。感謝您的信息,期待依賴注入模式。 – Felype