我已经确定了以下热点功能,目前占我程序执行时间的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)。
以下是此功能的相关性能分析数据:
*
我的观察:
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 sum
计算也需要一段时间。您可以看到*
here的完整实施。 GF256Elm
基本上是预生成表的向量查找和一些翻转。我的问题:
如何优化此功能?特别是关于*
- 在列表中使用sum
会让它更快吗?
我应该为deepSeq
使用未装箱的Int#
类型吗?还有哪些方法可以提高GF256Elm
操作的速度?
谢谢!