我目前正在撰写一篇科学文章,在那里我需要非常确切地引用。 有人可以指向我MSDN,MSDN文章,一些发表的文章来源或一本书,在那里我可以findWindows或.NET同步原语的性能比较。
我知道这些是在下降的性能顺序:互锁API,关键部分,.NETlocking语句,监视器,互斥体,EventWaitHandle,信号量。
非常感谢,
Ovanes
PS我发现了一本好书: Joe Duffy在Windows上的并发编程 。 本书是由.NET Framework的头部并发开发人员之一编写的,其内容非常精彩,有很多解释,如何工作或实现。
我如何检索显示器信息?
如何创build防止“服务器模式SSL必须使用带有关联私钥的证书”exception的X509证书?
在.NET中写入日志 – 权限问题
Process.Start – 如何将启动的可执行文件发送到后台(C#)
ASP.NET中的Windows时区缩写
为.NET程序提供输出types的Windows应用程序和控制台应用程序
托pipeWindows窗体中的WPF给出问题 – C#
将用户凭据保存在Windows应用程序中
对于XBox 360和Microsoft Windows的无锁编程注意事项的以下数字进行粗略比较可能会得心应手。
Windows上的同步指令和函数的性能因处理器类型和配置以及其他代码的运行而异。 多核和多插槽系统通常需要更长的时间才能执行同步指令,如果另一个线程当前拥有该锁,则获取锁需要更长的时间。
但是,即使通过非常简单的测试生成的一些测量值也是有用
记忆障碍测量为20-90个周期 。
测量InterlockedIncrement为36-90个周期 。
测量获取或释放临界区段的时间为40-100个循环 。
测量获得或释放互斥体大约需要750-2500个周期 。
这些测试是在一系列不同处理器上的Windows XP上完成的。 短时间在单处理器机器上,而在多处理器机器上时间较长。
我怀疑你会发现这些直接数字 – 他们根据底层操作系统和cpu,以及在不同的情况下有所不同。
比较这些原语的性能是很奇怪的,因为它们做了不同的事情–EventWaitHandle与关键部分有不同的行为,因此不能直接比较它们的性能。 另外,你会发现,在不同的情况下,他们的表现会有所不同 – 关键部分比无争议获取的互斥更快,但在争用面前表现会相似。 其中一些原始人在面对重大争夺时表现可怕的地方,其他人的规模会好得多。
我建议创建一个测试程序来衡量性能 – 不要花太长时间来编写和测量每个原语的性能,而且您可以回答关于论文中数字的任何问题。
行为是:
不是简单的降序列表,因为有些人比别人做更多的工作。
成本的变化取决于您所运行的cpu架构,系统内核的数量以及Windows的版本。
一些说明:
锁定语句是Monitor类的语法糖。
其中许多是令人难以置信的薄包装圆形底层win32 api调用,通常直接与P / Invoke。 其中一些本身又是一些cpu指令的薄包装。
指令的级别越低,与低级硬件的差别就越显着。 例如,同一个程序包/ NUMA节点中cpu中的高速缓存锁定和失效例程可能比旧式FSB类型的SMP系统中的更快。
找到具体的数字是困难的,我强烈建议你测试一下你的场景中的锁定,因为perf将取决于访问比率,争用模式和正在运行的硬件。 我也鼓励你在.NET 4.0中加入自旋锁,比如System.Threading.SpinLock和System.Threading.SemaphoreSlim。
这就是说,乔·达菲在他的博客上有几个帖子比较特定锁的性能,例如这个 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。