Performance 为什么使Vector成为函子、单子、应用程序、可选、可折叠和可遍历的实例的函数速度慢?
的版本0.8的更改日志列出了以下更改,并带有警告: 函子,单子,可应用,可选,可折叠和可遍历 装箱向量的实例(警告:它们往往比较慢,并且 仅为完整性提供) 有人能解释一下为什么会这样吗?这只是类型类专门化的正常成本,还是更有趣的东西 更新:查看一些特定实例,例如:Performance 为什么使Vector成为函子、单子、应用程序、可选、可折叠和可遍历的实例的函数速度慢?,performance,haskell,Performance,Haskell,的版本0.8的更改日志列出了以下更改,并带有警告: 函子,单子,可应用,可选,可折叠和可遍历 装箱向量的实例(警告:它们往往比较慢,并且 仅为完整性提供) 有人能解释一下为什么会这样吗?这只是类型类专门化的正常成本,还是更有趣的东西 更新:查看一些特定实例,例如: instance Foldable.Foldable Vector where {-# INLINE foldr #-} foldr = foldr 其他褶皱也是如此。这是否意味着一般情况下,Vectors的折叠速度慢?如果
instance Foldable.Foldable Vector where
{-# INLINE foldr #-}
foldr = foldr
其他褶皱也是如此。这是否意味着一般情况下,
Vector
s的折叠速度慢?如果不是,是什么让非专业化折叠速度慢到足以发出警告?我刚刚快速查看了源代码,实现看起来不会太慢。我认为作者添加了这个警告是因为当你在向量
单子中编写程序时,你是从这样一个高层次的角度工作的,以至于很容易忘记每个>=
实际上都是一个concatMap
,它天生就很慢
另一件事:
Vector
对于未装箱类型特别快。因此,用户可能会被吸引来使用monad符号(为了方便),而实际上他应该使用一种非固定类型(为了速度)。一年半前,我向Roman提交了这些实例的原始集合,并从那时起维护了向量实例。(一旦这些实例迁移到vector中,我就必须从vector实例中删除它们,现在只为真正奇特的东西维护它们)。他担心的是,如果人们以多态方式使用这些实例,那么,除非多态函数内联并单形化,否则无法触发使向量融合的规则
它们之所以存在,是因为地球上并非每一个代码都是特定于向量的,即使如此,有时也可以使用通用名称
这里的慢是相对的。最糟糕的情况是,它们的表现与其他任何人的折叠、捆绑等一样。但罗曼认为每一个装箱价值都是对个人的侮辱。:) 这是一个有趣的想法。不过,在接受答案之前,我会等一会儿,以防出现一个不那么投机的答案。(哦,当我这么说的时候,我并不想说是否定的……我想这个问题本身就有点推测性——《向量》的作者在写警告的时候是什么意思?)。没问题,在这种情况下我也会这么做——我的答案只是一个有根据的猜测。