Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell:惰性文本值与严格文本值,何时推荐哪一种?_Haskell_Text - Fatal编程技术网

Haskell:惰性文本值与严格文本值,何时推荐哪一种?

Haskell:惰性文本值与严格文本值,何时推荐哪一种?,haskell,text,Haskell,Text,我已经读了很多关于Data.Text的文章,但是我还没有发现什么时候更喜欢严格而不是懒惰,或者相反 我的理解是Data.Text.Strict是内存中连续字符的数据结构,而Data.Text.Lazy是连续字符块 我的问题是为什么我不应该总是使用Data.Text.Lazy?看起来唯一的开销是块管理,但我不知道它是否足够明显?作为交换,当文本值变大时,连接操作可以便宜得多 思想和见解欢迎 我认为使用Data.Text.Lazy继承了很多。因此,我的建议是更喜欢严格的,如果需要按顺序处理大块数据,

我已经读了很多关于Data.Text的文章,但是我还没有发现什么时候更喜欢严格而不是懒惰,或者相反

我的理解是Data.Text.Strict是内存中连续字符的数据结构,而Data.Text.Lazy是连续字符块

我的问题是为什么我不应该总是使用Data.Text.Lazy?看起来唯一的开销是块管理,但我不知道它是否足够明显?作为交换,当文本值变大时,连接操作可以便宜得多


思想和见解欢迎

我认为使用
Data.Text.Lazy
继承了很多。因此,我的建议是更喜欢
严格的
,如果需要按顺序处理大块数据,请使用以下方法之一。另请参见文档中的。

使用压缩数组列表的Unicode文本的一种节省时间和空间的实现。此表示法适用于高性能使用和流式传输大量数据。它提供了一种操作大量文本的方法,而无需将整个内容驻留在内存中

由于列表结构的优化,某些操作(如concat、append、reverse和cons)的复杂度比其Data.Text等价物要高。对于其他操作,惰性文本通常在严格文本的百分之几以内,但堆使用率更好。对于大于可用内存的数据,或者如果内存紧张,此模块将是唯一的选项

使用压缩Word16数组的Unicode文本的一种节省时间和空间的实现。适用于性能关键型应用,无论是在大数据量还是高速方面

此模块中的大多数函数都要进行融合,这意味着此类函数的管道通常最多分配一个文本值


因此,尽管
Data.Text
对于大多数目的来说已经足够了,
Data.Text.Lazy
特别适用于需要处理大量数据且无法同时将其保存在内存中的情况<代码>数据。文本
通常效率更高,但哪一种更适合您的应用程序完全取决于您的用例。一个好的经验法则是从严格开始,如果你有内存或速度问题,那么试着使用lazy。

通常情况下,连接到数据库的包(postgres、redis等)只会给你严格的值;从中获得的任何延迟值都是通过函数创建的,例如
Data.Text.lazy
fromStrict
。在这种情况下,使用惰性值会增加额外的开销。这类软件包的一个例子是
postgresql simple

,我从您的引用中得出的结论正好相反;这两种方法对于大多数目的来说都是足够的,对于某些目的来说,懒惰要好得多,而对于其他目的来说,严格则稍微好一点。因此,在默认情况下选择lazy是有意义的,以避免错误的选择造成巨大差异的情况,如果我最终发现需要优化性能以提高几个百分点(大概是在用尽所有简单的更大优化之后),那么转向strict可能是我考虑的选项之一。