优化sum,ZipList,Vector和unboxed类型

时间:2014-06-22 10:55:43

标签: haskell optimization lazy-evaluation

我已经确定了以下热点功能,目前占我程序执行时间的25%:

type EncodeLookup = [(GF256Elm, [GF256Elm])]

-- | Given the coefficients of a Polynomial and an x value,
-- calculate its corresponding y value.
-- coefficients are in ascending order [d, a1, a2, a3...] where y = d + a1*x + a2*x^2 ...
calc :: EncodeLookup -> [GF256Elm] -> [GF256Elm]
calc xsLookup poly =
    map f xsLookup
        where
            f (_, pList) = 
                let zl = (*) <$> ZipList (pList)  <*> ZipList poly
                    lst = getZipList zl
                    s = sum lst 
                in s

其中GF256Elm只是newtype的{​​{1}}包装器,其中包含自定义Int以及为其定义的其他操作(FiniteFields)。

以下是此功能的相关性能分析数据:

*

我的观察:

  1. individual inherited COST CENTRE no. entries %time %alloc %time %alloc calc 544 794418 1.6 3.1 27.5 19.7 calc.f 698 3972090 0.9 0.0 25.9 16.6 calc.f.s 709 3972090 7.4 6.2 11.0 7.8 fromInteger 711 3972090 0.7 0.0 0.7 0.0 + 710 11916270 2.9 1.6 2.9 1.6 calc.f.lst 708 3972090 0.0 0.0 0.0 0.0 calc.f.zl 699 3972090 6.8 8.8 14.0 8.8 * 712 11916270 7.2 0.0 7.2 0.0 的缓慢可能来自懒惰列表thunks
  2. sum计算也需要一段时间。您可以看到* here的完整实施。 GF256Elm基本上是预生成表的向量查找和一些翻转。
  3. 'ZipList`似乎也花了很多时间。
  4. 我的问题:

    1. 如何优化此功能?特别是关于* - 在列表中使用sum会让它更快吗?

    2. 我应该为deepSeq使用未装箱的Int#类型吗?还有哪些方法可以提高GF256Elm操作的速度?

    3. 谢谢!

0 个答案:

没有答案