单例模式性能问题

Singleton Pattern performance issue

本文关键字:问题 性能 单例模式      更新时间:2023-10-16

我正在审查一段现有的代码,它使用了很多单例类和访问。我正在努力提高这段代码的性能。

我想到的一件事是优化Singleton::getInstance()代码。

比起使用Singleton::getInstance(),我更倾向于用两个调用的结构来代替它。

。创建和准备单例实例的函数,如singleton::prepareInstance(),将在子系统开始时调用一次。b. getInstance()的内联实现,它只返回引用而不检查它是否有效。

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

当前的Singleton::getInstance()代码是这样的

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

π α ντα ρ ε ν提到的方法更快吗?

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

为什么需要检查有效性?我的单例GetInstance()实现通常是这样的:

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

我怀疑这样的代码应该有任何性能影响,也没有必要检查任何内容的有效性。

正确的Singleton::getInstance()实现不应该有任何性能问题。当然,第一次调用可能是昂贵的(对于单例实例的初始设置),但任何后续调用应该简单地返回实例,这应该是超级快。

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

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

在进行优化之前使用分析器。它通常会揭示运行时花费在哪里。在您的示例中,它很可能不是单例的getInstance方法,因为这些方法可能是内联的,分支预测将消除if语句的成本。如果结果是性能问题,这将是删除单例并改进体系结构的好借口。如果没有,请使用Meyer的单例模式(如果需要考虑多线程,仅适用于c++ 11)。