Haskell:我应该使用 Data.Text.Lazy.Builder 来构造我的文本值吗?
Haskell: should I use Data.Text.Lazy.Builder to construct my Text values?
我正在开发一个大型应用程序,它可以动态构建大量 Data.Text
值。我一直在使用 (<>)
和 Data.Text.concat
.
构建我所有的 Text
值
我最近才知道 Builder
type. The Beginning Haskell 这本书的存在有这样的说法:
Every time two elements are concatenated, a new Text
value has to be created, and this comes with some overhead to allocate memory, to copy data, and also to keep track of the value and release it when it's no longer needed... Both the text
and bytestring
packages provide a Builder
data type that can be used to efficiently generate large text values. [pg 240]
然而,这本书并没有给出 "large text values."
的确切含义的任何指示
所以,我想知道是否应该重构我的代码以使用 Builder
。也许你可以帮助我做出这个决定。
具体来说,我有这些问题:
1) 关于何时应该选择 Builder
而不是串联,是否有任何指南或 "best practices"?或者,我怎么知道给定的 Text
值 "large" 足以值得使用 Builder
?
2) 使用 Builder
是 "no brainer," 还是值得在进行大规模重构之前进行一些分析以确认其好处?
谢谢!
Data.Text.concat
是一个 O(n+m)
操作,其中 n
和 m
是您想要 concat
的字符串的长度。这是因为必须分配大小为 n + m
的新内存缓冲区来存储串联结果。
Builder
专门针对 mappend
操作进行了优化。这是一个便宜的 O(1)
操作(函数组合,GHC 也对其进行了出色的优化)。使用 Builder
,您实际上是在构建 说明 以了解如何生成最终字符串结果,但会延迟实际创建,直到您进行一些 Builder -> Text
转换。
要回答您的问题,如果您分析了您的应用程序并发现 Text.concat
占据了 运行 时间,则您应该选择 Builder
。这显然取决于您的需求和应用。没有关于何时应该使用 Builder
的一般规则,但对于简短的 Text
文字,可能没有必要。
如果使用 Builder
涉及 "undertaking a large-scale refactoring",那么分析绝对是值得的。尽管不言而喻 Haskell 自然会使这种重构比您习惯于使用对开发人员不太友好的语言所带来的痛苦要少得多,所以毕竟这可能不是一项艰巨的任务。
我正在开发一个大型应用程序,它可以动态构建大量 Data.Text
值。我一直在使用 (<>)
和 Data.Text.concat
.
Text
值
我最近才知道 Builder
type. The Beginning Haskell 这本书的存在有这样的说法:
Every time two elements are concatenated, a new
Text
value has to be created, and this comes with some overhead to allocate memory, to copy data, and also to keep track of the value and release it when it's no longer needed... Both thetext
andbytestring
packages provide aBuilder
data type that can be used to efficiently generate large text values. [pg 240]
然而,这本书并没有给出 "large text values."
的确切含义的任何指示所以,我想知道是否应该重构我的代码以使用 Builder
。也许你可以帮助我做出这个决定。
具体来说,我有这些问题:
1) 关于何时应该选择 Builder
而不是串联,是否有任何指南或 "best practices"?或者,我怎么知道给定的 Text
值 "large" 足以值得使用 Builder
?
2) 使用 Builder
是 "no brainer," 还是值得在进行大规模重构之前进行一些分析以确认其好处?
谢谢!
Data.Text.concat
是一个 O(n+m)
操作,其中 n
和 m
是您想要 concat
的字符串的长度。这是因为必须分配大小为 n + m
的新内存缓冲区来存储串联结果。
Builder
专门针对 mappend
操作进行了优化。这是一个便宜的 O(1)
操作(函数组合,GHC 也对其进行了出色的优化)。使用 Builder
,您实际上是在构建 说明 以了解如何生成最终字符串结果,但会延迟实际创建,直到您进行一些 Builder -> Text
转换。
要回答您的问题,如果您分析了您的应用程序并发现 Text.concat
占据了 运行 时间,则您应该选择 Builder
。这显然取决于您的需求和应用。没有关于何时应该使用 Builder
的一般规则,但对于简短的 Text
文字,可能没有必要。
如果使用 Builder
涉及 "undertaking a large-scale refactoring",那么分析绝对是值得的。尽管不言而喻 Haskell 自然会使这种重构比您习惯于使用对开发人员不太友好的语言所带来的痛苦要少得多,所以毕竟这可能不是一项艰巨的任务。