0

使用 Singleton / Static 会减慢多线程应用程序(在多核系统上运行)的速度吗?我正在运行一个在 8 核机器上创建 6 个线程的应用程序。最初在所有线程之间共享一些单例对象。而且我没有得到从单线程模型到多线程模型的预期性能提升。在此之后,我更改了我的代码,以便没有单例或静态(即尝试不在线程之间共享任何内容),并且我的性能提升了大约 6 倍。有人可以解释一下这种行为吗?

4

2 回答 2

4
  1. static绝对与减速无关。事实上,静态字段是访问速度最快的。

  2. 单例本身也不是问题。您可能已经懒惰地初始化了单例,其访问器方法是同步的。在这种情况下,您的代码 ss 只是使用了错误的习语。static单例的首选习惯用法是惰性初始化持有者类,它会产生零惩罚并且是完全线程安全的。

  3. 您在单例上调用的方法也可能需要同步。通常,如果我们完全使用可变单例,那是因为我们别无选择,只能使用它们。如果你确实有这样的选择,那么一定要避免单身。

为了获得最佳性能,请遵守以下简单规则:

  1. 共享尽可能少的可变状态。突变需要互斥,损害性能;

  2. 尽可能多地共享不可变状态。这将减少 CPU 缓存未命中并提高性能。

于 2013-05-30T07:37:42.740 回答
1

有状态的单例有很多问题,但是您所描述的听起来更像是对单例对象的争用。也就是说,你的速度变慢了,因为你的单例正在同步某些东西。在这种情况下,多线程版本可能不会做同样的事情;也就是说,您可能已经用性能问题换取了竞态条件。您需要向我们展示您的代码的更多细节以获得更具体的答案。照原样,几乎只是猜测。

顺便说一句,恕我直言,状态较少的单例最好处理为enum.

于 2013-05-30T07:28:34.120 回答