2015-05-09 48 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