【发布时间】:2011-05-11 23:49:27
【问题描述】:
我在 SPOJ 上的 PRIME1 问题上的尝试相当糟糕。我发现使用 ByteString really 有助于提高阅读问题文本的性能。但是,使用 ByteString 写出结果实际上比使用 Prelude 函数要慢一些。我试图弄清楚我是否做错了,或者这是预期的。
我使用 (putStrLn.show) 和 ByteString 等效项进行了三种不同的分析和计时:
- 我测试每个候选人,看看它是否 是素数。如果是这样,我将其添加到列表中 并用 (putStrLn . 显示)
- 我列出了所有素数 并使用 (putStrLn.unlines.show)
- 我列出了所有素数 并使用 地图 (putStrLn . 显示)
当您在一个函数中构建列表并在另一个函数中使用它时,我预计数字 2 和 3 的执行速度会变慢。通过在生成数字时打印它们,我避免为列表分配任何内存。另一方面,您在每次调用 putStrLn 时都会进行调用系统调用。正确的?所以我测试了,#1 实际上是最快的。
使用选项 #1 和 Prelude ([Char]) 函数实现了最佳性能。我希望我的最佳表现是使用 ByteString 的选项 #1,但事实并非如此。我只使用了惰性字节字符串,但我认为这无关紧要。会吗?
一些问题:
- 您是否希望 ByteStrings 写一堆更好的表现 整数到标准输出?
- 我是否缺少一种方式模式 生成并写出答案 这将导致更好的 性能?
- 如果我只是将数字写成 文本,如果有的话,是否有 使用 ByteString 有什么好处?
我的工作假设是,如果您不将整数与其他文本结合使用,那么用 ByteString 写出整数会更慢。如果您将整数与 [Char] 结合使用,那么使用 ByteStrings 会获得更好的性能。即,ByteString 重写:
putStrLn $ "the answer is: " ++ (show value)
将比上面写的版本快得多。这是真的吗?
感谢阅读!
【问题讨论】:
标签: haskell io performance bytestring