由于使用严格的数据构造函数导致性能下降的示例
Example of performance degradation due to the use of strict data constructors
我正在阅读 strict data constructors。链接的 Wiki 文章指出,
"strictness annotations can make performance worse [because] a strictness annotation forces the compiler to ensure that the field is fully evaluated before building the constructor, and if it turns out that the field was already evaluated then this is just wasted work".
我不明白为什么如果该字段已经被评估,那么它就是在浪费工作,因为无论如何都需要它的值来应用构造函数。
是否有一个例子可以说明这个问题或其他由于严格而导致的效率损失?
强制一个值,即使它已经被评估,也有一个小但存在的成本。
如果您有一个指向可能已被评估或未被评估的东西的指针(一个 thunk 或一个值),并且您将它包装在惰性数据构造函数中,您只需将该地址复制到它在内存中的位置。真快。
如果你有这样一个指针并且你想把它存储在一个严格的构造函数中,你必须先对它求值。这需要检查指针的最低位以查找可能的标记(指示评估的技巧)。如果不存在标签,您实际上会跳转到此指针以 enter thunk。在执行此操作之前,您必须将 return 帧 压入堆栈,以便最终执行流程 return 给您。然后 thunk 评估自己,将结果放入寄存器并跳转到 return 地址。然后就可以把这个结果存入内存了。
所以即使你指向的东西已经被评估过,你仍然需要做标签检查。而且我相信在某些情况下评估的东西没有标签(它是可选的),所以所有其他工作可能仍然会发生 – 没有。
我正在阅读 strict data constructors。链接的 Wiki 文章指出,
"strictness annotations can make performance worse [because] a strictness annotation forces the compiler to ensure that the field is fully evaluated before building the constructor, and if it turns out that the field was already evaluated then this is just wasted work".
我不明白为什么如果该字段已经被评估,那么它就是在浪费工作,因为无论如何都需要它的值来应用构造函数。
是否有一个例子可以说明这个问题或其他由于严格而导致的效率损失?
强制一个值,即使它已经被评估,也有一个小但存在的成本。
如果您有一个指向可能已被评估或未被评估的东西的指针(一个 thunk 或一个值),并且您将它包装在惰性数据构造函数中,您只需将该地址复制到它在内存中的位置。真快。
如果你有这样一个指针并且你想把它存储在一个严格的构造函数中,你必须先对它求值。这需要检查指针的最低位以查找可能的标记(指示评估的技巧)。如果不存在标签,您实际上会跳转到此指针以 enter thunk。在执行此操作之前,您必须将 return 帧 压入堆栈,以便最终执行流程 return 给您。然后 thunk 评估自己,将结果放入寄存器并跳转到 return 地址。然后就可以把这个结果存入内存了。
所以即使你指向的东西已经被评估过,你仍然需要做标签检查。而且我相信在某些情况下评估的东西没有标签(它是可选的),所以所有其他工作可能仍然会发生 – 没有。