我一直在并发编程的“不分担”原则下工作。本质上,我的所有工作线程都具有相同状态的不可变只读副本,它们之间从未共享(即使通过引用)。总体而言,这确实很好。
现在,有人引入了一个无锁单例缓存(例如静态字典),所有线程正在同时访问。由于字典在启动后永远不会更改,因此没有锁。没有任何线程安全问题,但是现在性能下降了。
问题是...由于没有锁,为什么引入此单例会导致性能下降?幕后到底发生了什么,可以解释这一点?
确认一下,唯一的改变就是访问这个新的单例,我只需注释掉对缓存的调用就可以可靠地重新创建它。
8
您是否已将分析器指向该代码?
—
Timo Geusch 2011年
除非您要对CLR以及Windows内核进行概要分析,否则概要分析不可能回答这个问题(对于普通程序员而言,这不是一件容易的事)。
—
伊比·拉格曼
@JoeGeeky好吧,我想这里对我唯一要做的就是+1和收藏!因为它们都是在毕竟间接的同一水平,并应符合在处理器缓存反正,等这似乎不可思议...
—
马克斯
FWIT我产生了几个线程并运行了一些计时器。我实例化了一个类,单例,lockedSingleton和dict <string,string>。在每个实例的第一个实例化之后,任何给定对象的连续运行大约需要2000ns。字典运行速度慢了2倍,可能是由构造函数代码引起的……它比锁本身慢。考虑到所有GC,操作系统对线程队列的处理以及其他开销……不确定是否可以真正回答这一问题。但是,从我的结果来看,我认为问题与Singletons无关。如果是像在MSDN上那样实现的,则不会。排除编译器优化。
—
P.Brian.Mackey 2011年
@JoeGeeky-另一个想法:使用缓存是否增加了间接级别?如果经常访问,则追逐额外的指针解引用(或MSIL等效项)可能会在本地间接间接复制上增加一些时间。
—
sdg