.NET或Windows同步基元性能规范

我目前正在撰写一篇科学文章,在那里我需要非常确切地引用。 有人可以指向我MSDN,MSDN文章,一些发表的文章来源或一本书,在那里我可以findWindows或.NET同步原语的性能比较。

我知道这些是在下降的性能顺序:互锁API,关键部分,.NETlocking语句,监视器,互斥体,EventWaitHandle,信号量。

非常感谢,
Ovanes

PS我发现了一本好书: Joe Duffy在Windows上的并发编程 。 本书是由.NET Framework的头部并发开发人员之一编写的,其内容非常精彩,有很多解释,如何工作或实现。

Solutions Collecting From Web of ".NET或Windows同步基元性能规范"

对于Xbox 360和Microsoft Windows的无锁编程注意事项的以下数字进行粗略比较可能会得心应手。


Windows上的同步指令和函数的性能因处理器类型和配置以及其他代码的运行而异。 多核和多插槽系统通常需要更长的时间才能执行同步指令,如果另一个线程当前拥有该锁,则获取锁需要更长的时间。

但是,即使通过非常简单的测试生成的一些测量值也是有用

  • 记忆障碍测量为20-90个周期
  • 测量InterlockedIncrement36-90个周期
  • 测量获取或释放临界区段的时间为40-100个循环
  • 测量获得或释放互斥体大约需要750-2500个周期

这些测试是在一系列不同处理器上的Windows XP上完成的。 短时间在单处理器机器上,而在多处理器机器上时间较长。

我怀疑你会发现这些直接数字 – 他们根据底层操作系统和CPU,以及在不同的情况下有所不同。

比较这些原语的性能是很奇怪的,因为它们做了不同的事情–EventWaitHandle与关键部分有不同的行为,因此不能直接比较它们的性能。 另外,你会发现,在不同的情况下,他们的表现会有所不同 – 关键部分比无争议获取的互斥更快,但在争用面前表现会相似。 其中一些原始人在面对重大争夺时表现可怕的地方,其他人的规模会好得多。

我建议创建一个测试程序来衡量性能 – 不要花太长时间来编写和测量每个原语的性能,而且您可以回答关于论文中数字的任何问题。

行为是:

  1. 不是简单的降序列表,因为有些人比别人做更多的工作。
  2. 成本的变化取决于您所运行的CPU架构,系统内核的数量以及Windows的版本。

一些说明:

  • 锁定语句是Monitor类的语法糖。
  • 其中许多是令人难以置信的薄包装圆形底层win32 api调用,通常直接与P / Invoke。 其中一些本身又是一些cpu指令的薄包装。

指令的级别越低,与低级硬件的差别就越显着。 例如,同一个程序包/ NUMA节点中cpu中的高速缓存锁定和失效例程可能比旧式FSB类型的SMP系统中的更快。

找到具体的数字是困难的,我强烈建议你测试一下你的场景中的锁定,因为perf将取决于访问比率,争用模式和正在运行的硬件。 我也鼓励你在.NET 4.0中加入自旋锁,比如System.Threading.SpinLock和System.Threading.SemaphoreSlim。

这就是说,乔·达菲在他的博客上有几个帖子比较特定锁的性能,例如这个 。