gsp*_*spr 16 performance haskell
向量版本0.8的更改日志列出了以下更改并带有警告:
盒装载体的Functor,Monad,Applicative,Alternative,Foldable和Traversable实例(警告:它们往往很慢并且只是为了完整性而提供).
有人可以解释为什么会这样吗?它只是类型类专业化的正常成本,还是更有趣的东西?
更新:看一些特定的实例,例如:
instance Foldable.Foldable Vector where
{-# INLINE foldr #-}
foldr = foldr
Run Code Online (Sandbox Code Playgroud)
并且类似地用于其他折叠.这是否意味着Vector
一般情况下折叠很慢?如果没有,是什么让一个非专业的折叠足够慢以保证警告?
Edw*_*ETT 15
我在一年半前将这些实例的原始集合提交给了Roman,并且从那时起就维护了vector-instances.(一旦它们迁移到vector中,我不得不从vector-instances中删除这些实例,现在只为真正奇特的东西维护它).他担心的是,如果人们以多态方式使用这些实例,那么除非多态函数被内联和单态化,否则使向量融合的规则不会触发.
它们存在是因为并非地球上的每一段代码都是特定于矢量的,即使这样,有时使用通用名称也是很好的.
这里的慢是相对的.最糟糕的情况是他们表现得像其他任何人的折叠,绑定等等,但罗曼将每一个盒装值视为个人侮辱.:)
我刚刚看了一下源代码,实现看起来并不太慢.我认为作者添加了这个警告,因为当你在Vector
monad中编写一个程序时,你就是从这样一个高级别的角度来看,很容易忘记每一个>>=
实际上都是a concatMap
,本来就很慢.
另一件事:Vector
对于未装箱的类型来说特别快.因此,用户可能会被吸引使用monad表示法(为了方便起见),而他实际上应该使用未装箱的类型(为了速度).