我试图比较锁定和无锁链表数据结构的性能。我已经为无锁链表实现了this算法。这两个程序都是用C实现的。
我正在测试4个线程。每个线程都有1000个插入操作。
我正在使用英特尔PCM工具来衡量性能。
以下是我的发现: 无锁:
ntdll.dll!RtlUserThreadStart
锁定:
<entry>
<record>126</record>
<time>2016/07/13 12:24:32.728</time>
<type>Error</type>
<source>Microsoft.VisualStudio.CommonIDE.ExtensibilityHosting.VsShellComponentModelHost</source>
<description>Still unable to load MEF component DLL: Could not load file or assembly 'DebuggerPackage.dll' or one of its dependencies. The system cannot find the file specified.</description>
<path>C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 14.0\COMMON7\IDE\EXTENSIONS\MICROSOFT\DEBUGGING TOOLS FOR WINDOWS\DEBUGGERPACKAGE\DebuggerPackage.dll</path>
</entry>
锁定版本在除IPC之外的每个计数上都表现更好。这是应该发生的吗?或者锁定免费数据结构应该表现更好吗?
如果是,那么使用无锁数据结构有什么好处? 任何帮助将不胜感激。
答案 0 :(得分:2)
锁定版本在除IPC之外的每个计数上都表现更好。这是应该发生的吗?或者锁定免费数据结构应该表现更好吗?
一般来说,性能更好的是工作负载详细信息和实现细节的函数。你引用的论文说
无锁数据结构 可能 具有更好的性能
(重点补充),但并不承诺在每种情况下都有更好的表现。虽然多个线程可能同时修改无锁数据结构,但即使没有冲突,每个修改也涉及更多操作。当 冲突时,性能会下降。
我还观察到,与锁定的代码相比,无锁代码的缓存未命中率更高。虽然我无法自信地解释这一点,但我至少可以想到两个可能的原因,为什么这将是无锁实施的预期后果。当然,效率较低的缓存使用会显着降低性能。
如果是,那么使用无锁数据结构有什么好处?
该报说,主要的好处是:
如果某个实现是无锁的,则各个进程的延迟或失败不会阻止系统中其他进程的进度。