单例模式性能问题

时间:2014-03-18 16:31:56

标签: c++ singleton

我正在审查一段使用大量单例类和访问的现有代码。我正在尝试提高此代码的性能。

首先想到的是优化Singleton :: getInstance()代码。

我倾向于用带有两个调用的结构替换它,而不是使用Singleton :: getInstance()。

一个。一个可以创建和准备单例实例的函数,如Singleton :: prepareInstance(),它将在子系统的开头被调用一次。 湾getInstance()的内联实现,只返回引用而不检查它是否有效。

这是一个可行的解决方案吗?有什么方法可以改进吗?

我看起来像当前的Singleton :: getInstance()代码

Singleton * Singleton::getInstance() {
    if(m_instance == NULL) {
        m_instance = new Singleton();
    }
    return m_instance;
}

πάνταῥεῖ提到的方法是否更快?

3 个答案:

答案 0 :(得分:6)

Singleton::getInstance()的正确实施不应该有任何性能问题。当然第一次调用可能代价很高(对于单例实例的初始设置),但任何后续调用都应该只返回应该超快的实例。

  

湾getInstance()的内联实现,只返回引用而不检查引用是否有效。

在我看来,这违背了单身人士模式的一个基本概念。 Singleton::getInstance()应始终返回有效的实例。

答案 1 :(得分:6)

  

湾getInstance()的内联实现,只返回引用而不检查引用是否有效。

为什么需要检查有效性?我的单例GetInstance()实现通常如下所示:

Singleton& Singleton::instance() {
    static Singleton theInstance;
    return theInstance;
}

我怀疑这些代码是否会对性能产生任何影响,也无需检查任何有效性。

答案 2 :(得分:0)

在进行优化之前使用分析器。它通常在运行时花费的地方很有启发性。在您的情况下,很可能不是单例的getInstance方法,因为这些可能是内联的,并且分支预测将消除if语句的成本。如果结果是性能问题,这将是移除单例并改进架构的一个很好的借口。如果没有,请使用Meyer的单例(如果多线程是一个问题,仅适用于C ++ 11)。