Control.Lens 是不是有性能开销?

Posted

技术标签:

【中文标题】Control.Lens 是不是有性能开销?【英文标题】:Does Control.Lens have a performance overhead?Control.Lens 是否有性能开销? 【发布时间】:2013-01-28 16:01:11 【问题描述】:

我很欣赏 Control.Lens 包。它确实有助于稍微弱一点的 Haskell 记录语法。我正在研究库的某些部分,其中性能是一个问题。有谁知道与函数中的基本模式匹配相比,使用通过如下所示的类型类公开的简单镜头会产生什么性能损失(如果有的话)?像这样使用 Lenses 有可能很好地解决记录命名空间冲突问题。我可以自己设置一些基准,但很好奇是否有人可以为我省去麻烦。谢谢。

镜头类

class LensX v where
  _x :: Functor f => (Double -> f Double) -> v -> f v

class LensY v where
  _y :: Functor f => (Double -> f Double) -> v -> f v

class LensZ v where
  _z :: Functor f => (Double -> f Double) -> v -> f v 

镜头实例

instance LensX Vec3 where
  _x f (Vec3 x y z) = fmap (\x' -> Vec3 x' y z) (f x)

instance LensY Vec3 where
  _y f (Vec3 x y z) = fmap (\y' -> Vec3 x y' z) (f y)

instance LensZ Vec3 where
  _z f (Vec3 x y z) = fmap (\z' -> Vec3 x y z') (f z)

提供 Lenses 的模块不必导入 Control.Lens 包,非常棒。该库的使用在此页面https://github.com/ekmett/lens/ 上进行了描述。

【问题讨论】:

你应该对其进行基准测试。 【参考方案1】:

您需要为此类镜头支付少量性能损失。它来自所有具有导致字典传递发生的约束的更高级别的类型。

这是您想要返回data-lens 的罕见情况之一,它没有这个问题,甚至可以让您的代码更快。 Data-lens,如果你解码 Store comonad 间接,使用你可以拥有的镜头最直接的表示:

newtype Lens s a = Lens (s -> (a, a -> s))

虽然库本身不支持多态镜头,但您可以构建自己的镜头类型,该镜头类型支持并且仍然为您提供高性能:

newtype Lens s t a b = Lens (s -> (a, b -> t))

对于您的特定目的,您可能还对linear 包感兴趣。

【讨论】:

我来看看 data-lens。谢谢。

以上是关于Control.Lens 是不是有性能开销?的主要内容,如果未能解决你的问题,请参考以下文章

镜头和类型系列

镜头中的视图和使用有啥区别?

我不是药神,我是AI智能电销机器人

单例模式

单列模式

单例模式