代码之家  ›  专栏  ›  技术社区  ›  Brandon

缓存遗忘的数据结构和动态语言-有效吗?

  •  3
  • Brandon  · 技术社区  · 15 年前

    我最近一直在读缓存中被遗忘的数据结构,比如辅助缓冲区堆。这些数据结构的工作原理是将最近访问的元素保存在缓存内存中,这样任何后续的访问都会更快。

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   S.Lott    15 年前

    在C(或C++)中,您对每个数据结构的精确大小有细粒度的控制。您还可以对存储分配进行细粒度控制。毕竟,你可以延长 new 方法、用途 malloc 直接或以其他方式构造内存以创建空间位置。

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

    在Python中,您可能有一些时间位置,但您几乎没有空间位置。

    通过对结果的简单记忆,可以增强时间区域性。这是一种常见的加速,人们通常会包括一个memoization装饰器来将memoization(时间位置)从核心算法中分离出来。

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

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

        2
  •  1
  •   John Liptak    14 年前

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

    另外,大多数VM内存分配器将在生成空间结束时分配,只要您同时分配所有对象,就可以从OK开始。不幸的是,一些高速缓存遗忘算法假定您可以更改内存布局,而这通常在虚拟机中是不可能的。

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

    此外,还可以压缩垃圾收集器和其他“优化”,这是虚拟机可以自由执行的,并且您需要的控制与这些算法的当前研究状态之间存在很大差距。