使用 Singleton / Static 会减慢多线程应用程序(在多核系统上运行)的速度吗?我正在运行一个在 8 核机器上创建 6 个线程的应用程序。最初在所有线程之间共享一些单例对象。而且我没有得到从单线程模型到多线程模型的预期性能提升。在此之后,我更改了我的代码,以便没有单例或静态(即尝试不在线程之间共享任何内容),并且我的性能提升了大约 6 倍。有人可以解释一下这种行为吗?
问问题
2026 次
2 回答
4
static
绝对与减速无关。事实上,静态字段是访问速度最快的。单例本身也不是问题。您可能已经懒惰地初始化了单例,其访问器方法是同步的。在这种情况下,您的代码 ss 只是使用了错误的习语。
static
单例的首选习惯用法是惰性初始化持有者类,它会产生零惩罚并且是完全线程安全的。您在单例上调用的方法也可能需要同步。通常,如果我们完全使用可变单例,那是因为我们别无选择,只能使用它们。如果你确实有这样的选择,那么一定要避免单身。
为了获得最佳性能,请遵守以下简单规则:
共享尽可能少的可变状态。突变需要互斥,损害性能;
尽可能多地共享不可变状态。这将减少 CPU 缓存未命中并提高性能。
于 2013-05-30T07:37:42.740 回答