Data structures 缓存不经意的数据结构和动态语言-有效吗?

Data structures 缓存不经意的数据结构和动态语言-有效吗?,data-structures,caching,performance,dynamic-languages,Data Structures,Caching,Performance,Dynamic Languages,我最近读了一些关于缓存无关的数据结构的文章,比如辅助缓冲堆。这些数据结构的工作原理是将最近访问的元素保留在高速缓存中,因此任何后续访问也会更快 这些数据结构中的大多数都是用像C/C++这样的低级语言实现的。是否值得尝试将这些数据结构移植到Python这样的动态语言上,或者在虚拟机上运行的开销破坏了这些数据结构的所有性能优势?看起来像是后者,但我想我会问是否有人真的有这方面的经验。在C(或C++)中,您可以对每个数据结构的确切大小进行细粒度控制。您还可以对存储分配进行细粒度控制。毕竟,您可以扩展n

我最近读了一些关于缓存无关的数据结构的文章,比如辅助缓冲堆。这些数据结构的工作原理是将最近访问的元素保留在高速缓存中,因此任何后续访问也会更快

这些数据结构中的大多数都是用像C/C++这样的低级语言实现的。是否值得尝试将这些数据结构移植到Python这样的动态语言上,或者在虚拟机上运行的开销破坏了这些数据结构的所有性能优势?看起来像是后者,但我想我会问是否有人真的有这方面的经验。

在C(或C++)中,您可以对每个数据结构的确切大小进行细粒度控制。您还可以对存储分配进行细粒度控制。毕竟,您可以扩展
new
方法,直接使用
malloc
,或者构造内存来创建空间局部性

在大多数动态语言(如Python)中,您根本无法控制任何东西的确切大小,更不用说它的位置了

在Python中,您可能有一些时间局部性,但您几乎没有空间局部性

时间局部性可以通过简单的结果记忆来增强。这是一种常见的加速方式,人们通常包括一个记忆装饰器,以将记忆(时间局部性)与核心算法解耦

我不认为C或C++缓存遗忘的实现转化为动态语言,因为我认为你没有足够的控制。相反,只需利用记忆来提高速度


缓存无关算法的一个要点是,对象的大小实际上并不重要(因为您不知道下一级内存分页的大小),因此无法知道确切大小并不重要。在某些情况下,超过1个对象的大小“适合”下一个内存块大小。(注意:对于缓存感知实现来说,不知道对象的大小是一个重要问题)

此外,大多数VM内存分配器将在生成空间结束时进行分配,因此只要您同时分配所有对象,就可以开始正常运行。不幸的是,一些不在乎缓存的算法假设您可以更改内存布局,而这对于VM来说通常是不可能的

另一个大问题是,大多数基于VM的实现都使用对象引用。因此,一个包含三个字符串的对象实际上是4个对象(对象本身和3个字符串对象)。除非这四个对象相邻分配,否则该算法的分析将失败


再加上压缩垃圾收集器和虚拟机可以自由进行的其他“优化”,您所需的控制与这些算法的当前研究状态之间存在很大差距。

如果您在Python中使用numpy数组,您可以直接控制大小和位置。