Optimization 具有并发分配器的自由列表

Optimization 具有并发分配器的自由列表,optimization,memory,garbage-collection,performance,allocator,Optimization,Memory,Garbage Collection,Performance,Allocator,自由列表是通过重用已分配的现有内存来加速分配的常用方法。有没有一种方法可以在并发分配器中使用空闲列表,而不会对每次分配产生锁的开销(这会抵消空闲列表的预期性能增益)?使用一个。您可以拥有特定于线程的空闲列表块 基本上,有一些系统填充空闲列表(例如垃圾收集器)。然后每个线程都可以有自己的空闲列表块,其中包含少量的条目。锁定将用于分配新块。对于包含30个条目的块,每30次分配只锁定一次。相反,对于特定于线程的区块,您可能需要更快地运行GC,因为即使某些特定于线程的区块仍然有一些可用条目,共享列表也可

自由列表是通过重用已分配的现有内存来加速分配的常用方法。有没有一种方法可以在并发分配器中使用空闲列表,而不会对每次分配产生锁的开销(这会抵消空闲列表的预期性能增益)?

使用一个。

您可以拥有特定于线程的空闲列表块


基本上,有一些系统填充空闲列表(例如垃圾收集器)。然后每个线程都可以有自己的空闲列表块,其中包含少量的条目。锁定将用于分配新块。对于包含30个条目的块,每30次分配只锁定一次。相反,对于特定于线程的区块,您可能需要更快地运行GC,因为即使某些特定于线程的区块仍然有一些可用条目,共享列表也可能变为空。

这实际上是使用锁的性能优势吗,据我所知,无锁数据结构通常仍具有与锁定变量大致相同的速度(但失去了死锁的可能性等)?如果争用很少,则无锁实现应优于使用锁(读-修改-写入而不是锁-读-修改-写入-解锁),特别是如果使用锁导致操作系统调用。如果存在严重的争用,无锁实现实际上可能会有更差的性能(由于必须退出并重复重试),但在这种情况下,使用多个线程锁定实现实际上也不会获得任何好处,因为如果链表变异是您的主要工作,无论如何,你的大部分作品都会被连载。