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

时间:2010-01-22 14:00:12

标签: data-structures caching performance dynamic-languages

我最近一直在阅读缓存遗忘数据结构,如辅助缓冲堆。这些数据结构的工作原理是将最近访问过的元素保存在高速缓存中,以便后续访问也更快。

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

2 个答案:

答案 0 :(得分:2)

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

在大多数动态语言(如Python)中,你无法控制任何事物的确切大小,更不用说它的位置了。

在Python中,你可能有一些时间局部性,但你很少或没有空间局部性。

通过简单的结果记忆可以增强时间局部性。这是一个常见的加速,人们通常会包含一个memoization装饰器来解开核心算法的记忆(时间局部性)。

我认为C或C ++缓存无意识的实现不会转换为动态语言,因为我认为你没有足够的控制权。相反,只需利用memoization加速。

http://wiki.python.org/moin/PythonDecoratorLibrary#Memoize

答案 1 :(得分:1)

缓存遗忘算法的一个主要观点是对象的大小并不重要(因为你无论如何都不知道下一级内存分页的大小),因此无法知道确切的大小并不重要。在某些时候,超过1个对象的大小“适合”到下一个内存块大小。 (注意:不知道对象的大小是缓存感知实现的一个重要问题)。

此外,大多数VM内存分配器将在生成空间结束时分配,因此只要您同时分配所有对象,就可以开始了。不幸的是,一些缓存不经意的算法假设您可以更改内存布局,这通常是VM无法实现的。

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

添加压缩垃圾收集器和VM可以自由执行的其他“优化”,并且您需要的控件与这些算法的当前研究状态之间存在显着差距。