【问题标题】:Example of performance degradation due to the use of strict data constructors由于使用严格的数据构造函数而导致性能下降的示例
【发布时间】:2017-05-28 03:45:56
【问题描述】:

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

“严格性注解会使性能变差 [因为] 严格性注解会强制编译器确保在构建构造函数之前对该字段进行全面评估,如果事实证明该字段已被评估,那么这只是浪费工作” .

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

有没有一个例子来说明这个问题或其他由于严格而导致的效率损失?

【问题讨论】:

    标签: haskell strictness


    【解决方案1】:

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

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

    如果你有这样一个指针并且你想将它存储在一个严格的构造函数中,你必须先评估它。这需要检查指针的最低位是否有可能的标签(表示评估的技巧)。如果不存在标签,您实际上会跳转到该指针以 enter thunk。在执行此操作之前,您必须将 返回帧 压入堆栈,以便执行流程最终返回给您。然后 thunk 评估自身,将结果放入寄存器并跳转到返回地址。然后你可以把这个结果存入内存。

    所以即使你指向的东西已经被评估过,你仍然需要做标签检查。而且我相信在某些情况下,被评估的东西没有标签(它是可选的),所以所有其他的工作可能仍然会发生——没有任何意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多