我正在审查一段使用大量单例类和访问的现有代码。我正在尝试提高此代码的性能。
首先想到的是优化Singleton :: getInstance()代码。
我倾向于用带有两个调用的结构替换它,而不是使用Singleton :: getInstance()。
一个。一个可以创建和准备单例实例的函数,如Singleton :: prepareInstance(),它将在子系统的开头被调用一次。 湾getInstance()的内联实现,只返回引用而不检查它是否有效。
这是一个可行的解决方案吗?有什么方法可以改进吗?
我看起来像当前的Singleton :: getInstance()代码
Singleton * Singleton::getInstance() {
if(m_instance == NULL) {
m_instance = new Singleton();
}
return m_instance;
}
πάνταῥεῖ提到的方法是否更快?
答案 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)。