使用严格数据构造函数导致性能下降的示例

时间:2017-01-12 21:25:45

标签: haskell strictness

我正在阅读strict data constructors。链接的Wiki文章指出,

  

"严格注释可能会使性能变差[因为]严格注释会强制编译器确保在构建构造函数之前完全评估该字段,如果事实证明该字段已经被评估,那么这只是浪费了工作"。

我不明白为什么如果已经对该字段进行了评估,那么这是浪费的工作,因为无论如何都需要它来应用构造函数。

是否有一个例子说明了这个问题或其他因严格性而导致的效率损失?

1 个答案:

答案 0 :(得分:8)

强制一个值,即使它已被评估,但成本很小但是存在。

如果你有一个可能已经或可能没有被评估的东西的指针(一个thunk或一个值),并且你将它包装在一个惰性数据构造函数中,你只需将该地址复制到它在内存中的位置。那很快。

如果您有这样的指针并且想要将其存储在严格的构造函数中,则必须先对其进行求值。这需要检查指针的最低位以寻找可能的标签(表示评估的技巧)。如果没有标签,你实际上跳转到指针输入 thunk。在此之前,您必须将返回框架推入堆栈,以便最终执行流程返回给您。然后thunk自我评估,将结果放入寄存器并跳转到返回地址。然后你可以把这个结果放到内存中。

因此,即使您指向的内容已经过评估,您仍然需要进行标记检查。而且我相信在某些情况下评估的东西没有标签(它是可选的),所以其他所有的工作可能仍然会发生 - 什么也不做。