无锁链接列表的性能比锁定的对应列表差

时间:2016-07-12 19:45:17

标签: c multithreading linked-list profiling lock-free

我试图比较锁定和无锁链表数据结构的性能。我已经为无锁链表实现了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 &apos;DebuggerPackage.dll&apos; 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之外的每个计数上都表现更好。这是应该发生的吗?或者锁定免费数据结构应该表现更好吗?

如果是,那么使用无锁数据结构有什么好处? 任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

锁定版本在除IPC之外的每个计数上都表现更好。这是应该发生的吗?或者锁定免费数据结构应该表现更好吗?

一般来说,性能更好的是工作负载详细信息和实现细节的函数。你引用的论文说

  

无锁数据结构 可能 具有更好的性能

(重点补充),但并不承诺在每种情况下都有更好的表现。虽然多个线程可能同时修改无锁数据结构,但即使没有冲突,每个修改也涉及更多操作。当 冲突时,性能会下降。

我还观察到,与锁定的代码相比,无锁代码的缓存未命中率更高。虽然我无法自信地解释这一点,但我至少可以想到两个可能的原因,为什么这将是无锁实施的预期后果。当然,效率较低的缓存使用会显着降低性能。

  

如果是,那么使用无锁数据结构有什么好处?

该报说,主要的好处是:

  

如果某个实现是无锁的,则各个进程的延迟或失败不会阻止系统中其他进程的进度。