Haskell 何时使用ByteString,何时不使用?
我在SPOJ上的PRIME1问题上做了相当糟糕的尝试。我发现使用ByteString确实有助于提高阅读问题文本的性能。然而,使用ByteString写出结果实际上比使用Prelude函数稍微慢一些。我在试图弄清楚我是做错了,还是这是意料之中的 我使用(putStrLn.show)和ByteString等效程序以三种不同的方式进行了评测和计时:Haskell 何时使用ByteString,何时不使用?,haskell,io,performance,bytestring,Haskell,Io,Performance,Bytestring,我在SPOJ上的PRIME1问题上做了相当糟糕的尝试。我发现使用ByteString确实有助于提高阅读问题文本的性能。然而,使用ByteString写出结果实际上比使用Prelude函数稍微慢一些。我在试图弄清楚我是做错了,还是这是意料之中的 我使用(putStrLn.show)和ByteString等效程序以三种不同的方式进行了评测和计时: 我对每个候选人进行测试,看是否 这是最好的。如果是,我会将其添加到列表中 并用(putStrLn)写出。 (节目) 我列出所有素数 并使用 (putStr
- 你希望ByteStrings能 在写一大堆文章时表现更好 整数到标准输出
- 我是不是错过了一个模式 生成并写出答案 这将导致更好的结果 表演
- 如果我只是把数字写成 文本,如果有的话,什么时候有 使用ByteString的好处是什么
putStrLn $ "the answer is: " ++ (show value)
将比上面写的版本快得多。这是真的吗
谢谢你的阅读 使用ByTestRing进行大容量输入通常更快,因为数据密集,所以从磁盘到内存的随机数据更少
但是,将数据写入输出有点不同。通常,您正在序列化一个结构,生成许多小的写操作。因此,在这种情况下,bytestring的密集、大容量写入对您没有多大帮助。即使是常规的字符串
也可以在增量输出时正常工作
然而,一切都没有失去。通过在内存中高效地构建ByTestRing,我们可以恢复快速的批量写入。各种*-builder
软件包都采用了这种方法:
此外,即使是大容量写入,性能也将取决于类型和bytestring之间的转换函数的效率。对于
Integer
,您可以简单地将内存中的位模式复制到输出,或者通过一些低效的解码器。因此,您有时需要考虑正在使用的编码函数的质量,而不仅仅是使用Char/String还是bytestring IO。请注意,bytestring
和String
之间的主要区别不是性能。前者用于二进制数据,而后者用于Unicode文本。如果您有二进制数据,请使用ByteString
,如果您有Unicode文本,请使用中的text
类型。您能告诉我上面提到的一个库的核心吗。即,将转换流化为不断增长的缓冲区的部分?我不熟悉这些库的内部结构。Text.Blaze.Renderer.UTF8中的renderHtml就是一个例子吗?例如,在二进制文件中,a是一个连续函数,异步更新可变缓冲区。