gpt4 book ai didi

performance - Haskell中的平等效率

转载 作者:行者123 更新时间:2023-12-03 13:21:05 28 4
gpt4 key购买 nike

我有一个函数,它接受数据并返回相同的数据或稍作修改的版本。

如果我的程序改变了,我想让我的程序做一件事,如果它没有改变,我想让它做另一件事。

以前我退回了一对 (Bool,Object)并使用 fst检查它是否改变了。最近我突然想到,我可以通过返回对象并使用 == 检查是否相等来简化代码。 .

但后来我意识到 Haskell 并没有区分深度相等检查和“对象标识”(即指针相等)。那么我怎么知道是否使用 ==会不会有效率?我应该出于效率原因避免它,还是在某些情况下我可以依赖编译器来确定它不需要进行深度相等检查?

通常我在编写初始程序时不会太担心效率,但这会影响到我的模块的接口(interface),所以我想在编写太多代码之前把它做好,而且编写太多程序似乎不值得只是一小段代码效率较低。此外,我想更好地了解我可以依靠 GHC 来帮助我进行哪些优化。

最佳答案

依靠不确定的编译器优化来提供诸如常量时间相等与线性时间深度相等之类的重要性能保证总是一个坏主意。使用封装值以及有关该值是否为新的信息的新类型会更好。根据您的应用程序,这可以是

data Changed a = Changed a | Unchanged a

或者
data Changed a = Changed a | Unchanged

我们实际上在 Glasgow Haskell 编译器中使用了类似的类型,因此我们可以继续运行优化器,直到代码停止更改。我们还运行迭代数据流分析,直到结果停止变化。

我们发现将这种类型设为 monad 很有用,这样我们就可以使用 do 编写一些简单的高阶函数。符号,但这不是必需的——只是为了方便。

摘要:如果您想要恒定时间检查,请自己编写代码——不要依赖可能不存在的编译器优化——或者可能会在下一个版本中更改。

关于performance - Haskell中的平等效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1976247/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com