gpt4 book ai didi

haskell - 为什么从 Data.Text 构建 Haskell 字符串这么慢

转载 作者:行者123 更新时间:2023-12-02 16:23:53 25 4
gpt4 key购买 nike

所以我有一个位置类

data Location = Location {
title :: String
, description :: String
}

instance Show Location where
show l = title l ++ "\n"
++ replicate (length $ title l) '-' ++ "\n"
++ description l

然后我将其更改为使用Data.Text

data Location = Location {
title :: Text
, description :: Text
}

instance Show Location where
show l = T.unpack $
title l <> "\n"
<> T.replicate (T.length $ title l) "-" <> "\n"
<> description l

使用标准,我对 StringData.Text 实现上 show 所花费的时间进行了基准测试:

benchmarks = [ bench "show" (whnf show l) ]
where l = Location {
title="My Title"
, description = "This is the description."
}

String 实现花费了 34 纳秒,Data.Text 实现几乎慢了六倍,为 170 纳秒

如何让 Data.TextString 一样快速工作?

编辑:愚蠢的错误

我不确定这是如何发生的,但我无法复制原始的速度差异:现在对于字符串和文本我分别得到 28ns 和 24ns

对于更激进的 bench "length.show"(whnf (length . show) l) 基准测试,对于字符串和文本,我分别得到 467ns 和 3954ns。

如果我使用一个非常基本的惰性构建器,没有复制的破折号

import qualified Data.Text.Lazy.Builder as Bldr

instance Show Location where
show l = show $
Bldr.fromText (title l) <> Bldr.singleton '\n'
-- <> Bldr.fromText (T.replicate (T.length $ title l) "-") <> Bldr.singleton '\n'
<> Bldr.fromText (description l)

并尝试原始的普通show基准测试,我得到19ns。现在这是有问题的,因为使用 show 将构建器转换为字符串会转义换行符。如果我用 LT.unpack $ Bldr.toLazyText 替换它,其中 LTData.Text.Lazy 的合格导入,那么我得到192纳秒。

我正在 Mac 笔记本电脑上对此进行测试,我怀疑我的计时被机器噪音严重破坏了。感谢您的指导。

最佳答案

你无法让它变得那么快,但你可以加快速度。

正在追加

Text被表示为一个数组。这使得<>相当慢,因为必须分配一个新数组,并且每个 Text复制到其中。您可以通过将每个部分转换为 String 来解决此问题首先,然后将它们连接起来。我想象Text可能还提供了一种有效的方法来一次连接多个文本(正如 commenter 提到的,您可以使用惰性构建器),但为此目的会更慢。另一个不错的选择可能是 Text 的惰性版本。 ,这可能支持高效的串联。

分享

在您的 String 中基于实现,description字段根本不必复制。它只是在 Location 之间共享结果显示 Location 。没有办法用Text来完成这个任务。版本。

关于haskell - 为什么从 Data.Text 构建 Haskell 字符串这么慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33710015/

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