Haskell:我应该使用Data.Text.Lazy.Builder来构造我的Text值吗?

the*_*pie 5 text haskell

我正在开发一个大型应用程序,可以动态构建大量Data.Text值.我一直在Text使用(<>)和构建我的所有值Data.Text.concat.

我最近才知道这种Builder类型的存在.该起点哈斯克尔书中有这样一段话吧:

每次连接两个元素时,都Text必须创建一个新值,这会带来一些开销来分配内存,复制数据,以及跟踪值并在不再需要时释放它... textbytestring包提供Builder可用于有效生成大文本值的数据类型.[第240页]

但是,这本书没有说明"大文本值"的确切含义.

所以,我想知道我是否应该重构我的代码来使用Builder.也许你可以帮我做出决定.具体来说,我有这些问题:

1)是否有任何关于何时应该选择Builder连接的指南或"最佳实践" ?或者,我怎么知道一个给定的Text值足够"大",值得使用Builder

2)使用Builder"没脑子",或者在进行大规模重构之前是否值得进行一些分析以确认其好处?

谢谢!

cdk*_*cdk 5

Data.Text.concat是一个O(n+m)操作,其中nm是您想要的字符串的长度concat.这是因为n + m必须分配大小的新内存缓冲区来存储连接的结果.

Builder专门针对mappend操作进行了优化.这是一种廉价的O(1)操作(功能组合,GHC也极好地优化).随着Builder你基本上是建立在说明如何产生最终字符串结果,但推迟实际创作,直到你做一些Builder -> Text改造.

要回答您的问题,您应该选择Builder是否已经分析了应用程序,并发现它们Text.concat在运行时占主导地位.这显然取决于您的需求和应用.什么时候应该使用没有一般规则,Builder但对于简短的Text文字,可能没有必要.

如果使用Builder涉及"进行大规模重构",那么分析肯定是值得的.虽然不言而喻,Haskell自然会使这种重构比你习惯于开发人员友好的语言少得多,所以它可能并不是一件如此艰难的事情.