gpt4 book ai didi

haskell - Codec.Binary.Base64.encode 很慢

转载 作者:行者123 更新时间:2023-12-03 13:52:10 24 4
gpt4 key购买 nike

我正在使用 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 个字节。

最佳答案

试试 the base64-bytestring library .通常使用 ByteString s 在处理二进制数据时会大大提高性能。列表类型由于其简单性而作为控制结构很有用,但它的性能并不好。

关于haskell - Codec.Binary.Base64.encode 很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20953753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com