拉链在实践中的表现如何,应该在啥时候使用?

Posted

技术标签:

【中文标题】拉链在实践中的表现如何,应该在啥时候使用?【英文标题】:How well do zippers perform in practice, and when should they be used?拉链在实践中的表现如何,应该在什么时候使用? 【发布时间】:2011-02-01 16:05:48 【问题描述】:

我认为zipper 是个好主意;它优雅地提供了一种遍历列表或树的方法,并以一种功能性的方式进行本地更新。

渐近地,成本似乎是合理的。但是遍历数据结构需要在每次迭代时分配内存,而普通的列表或树遍历只是指针追逐。这似乎很昂贵(如果我错了,请纠正我)。

成本高吗?什么情况下使用拉链才合理?

【问题讨论】:

顺便说一句:感谢您发布论文链接,看起来不错。起初我认为这是与 db 相关的,因为 performance 标签上的 redgate 图标。有人应该打电话给 YKK,让他们知道zipper 标签的可用广告空间。 啊。我想知道那个标志是什么。我以为是瑞奇热维斯。 【参考方案1】:

我可以提供一个可靠的数据点:John Dias 和我有一个paper in the 2005 ML Workshop,我们在其中比较了使用拉链来表示控制流图的成本与在 Objective Caml 中使用可变记录字段的成本。我们非常惊喜地发现,使用基于 zipper 的控制流图的编译器的性能实际上略好于使用带有指针链接的可变记录的传统数据结构的性能。我们找不到认真的分析工具来准确地告诉我们 为什么 zipper 更快,但我怀疑原因是要维护的不变量较少,因此指针分配相对较少。优化器也有可能足够聪明,可以分摊拉链产生的一些分配成本。在任何情况下,zipper 都可以用于优化编译器,并且实际上有一点性能好处

【讨论】:

您的代码可用吗?请注意,OCaml 有一个异常低效的写入屏障,它会惩罚命令式代码中的指针写入。

以上是关于拉链在实践中的表现如何,应该在啥时候使用?的主要内容,如果未能解决你的问题,请参考以下文章

Java程序中的异常应该在啥时候抛出

在 verilog中的非阻塞赋值在啥时候赋值时刻结束?

我应该在啥时候使用 Android 的不同消息类型?

C++ 中的局部变量通常在啥时候分配内存?

java中的数据在啥时候可能会发生隐式转换?

UIViewController 的 viewDidAppear/viewDidDisappear:应该在啥时候调用这些方法?