我正在使用http://hackage.haskell.org/package/dataenc-0.14.0.5/docs/Codec-Binary-Base64.html#v:encode,我发现这非常缓慢:
import qualified Codec.Binary.Base64 as C
import System.Environment
main = do
[arg] <- getArgs
print $ length $ C.encode $ replicate (read arg) 80
参数10 ^ 5的运行时间:0.5秒,2 * 10 ^ 5:3.4秒,3 * 10 ^ 5:9.4秒。 但这样的事情应该在线性时间内运行吗?
虽然我正在寻找问题的原因 - 是否有解决方法(不同的库)?
PS:这行代码https://github.com/magthe/dataenc/blob/master/src/Codec/Binary/Base64.hs#L77看起来非常值得怀疑(即二次方):
doEnc acc (o1:o2:o3:os) = doEnc (acc ++ enc3 [o1, o2, o3]) os
doEnc acc os = EPart acc (eI os)
果然,使用简单的代码
encode ws = case ws of
[] -> []
o1:ws2 -> case ws2 of
[] -> take 2 (enc3 [o1,0,0]) ++ "=="
o2:ws3 -> case ws3 of
[] -> take 3 (enc3 [o1,o2,0]) ++ "="
o3:ws4 -> enc3 [o1,o2,o3] ++ encode ws4
已经给出了极大的改进(例如,4秒内编码的10 ^ 8字节)
PPS:根据以下建议,此计划
import qualified Data.ByteString as B
import qualified Data.ByteString.Base64 as B64
import System.Environment
main = do
[arg] <- getArgs
print $ B.length $ B64.encode $ B.replicate (read arg) 80
在0.4秒内编码10 ^ 8个字节。
答案 0 :(得分:3)
试试the base64-bytestring
library。通常在处理二进制数据时使用ByteString
将极大地提高性能。列表类型作为控制结构很有用,因为它简单但效果不佳。