gpt4 book ai didi

haskell - 为什么我的 IO 在 Erlang 中运行得这么慢?

转载 作者:行者123 更新时间:2023-12-02 21:31:00 26 4
gpt4 key购买 nike

我正在将文本文件中写入的 512^2 个空格分隔的 double 通过管道传输到标准输入读取到我的 Erlang 程序中。

在 Erlang 中,这需要 2 分 25 秒,在等效的 Haskell 程序中,需要 3 秒,所以我必须以某种方式反对 Erlang 的做法。

我是否以一种愚蠢的方式使用了 Erlang 的 IO 原语,或者我的程序还有其他问题吗?

请注意,我不关心结果列表中值的顺序,因此没有反向操作。

二郎:

-module(iotest).

-import(io).

-export([main/0]).

main() ->
Values = read(),
io:write(Values).

read() -> read([]).

read(Acc) ->
case io:fread("", "~f") of
{ok, Value} -> read([Value | Acc]);
eof -> Acc
end.

haskell :

module IOTest (
main
) where

main :: IO ()

main = do
text <- getContents
let values = map read (words text) :: [Double]
putStrLn $ show values
return ()

非常感谢您的帮助。

最佳答案

不,你没有以愚蠢的方式使用 Erlang IO。这是 Erlang IO 的问题,众所周知,它的速度并不快。 Erlang 广泛用于编写服务器,因此面向 socked 的 IO 得到了很好的调整。面向 block 的文件 IO 并没有那么糟糕,但是使用 io 模块来处理 stdin 效果不佳。 Erlang 并未广泛用于此类工作。如果您需要这种操作,您应该编写自己的专门输入例程。您有两个选择:

  1. 使用 io 以原始和二进制模式从文件读取,然后使用二进制模块拆分输入,然后使用 list_to_float/1 进行转换。
  2. 使用专门的面向端口的标准输入读取例程(例如,您可以在 http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7 note read/0 函数和 -noshell -noinput 中看到code> vm 调用的参数),然后按照第一个选项继续。

根据我的观点(以及根据我之前的经验),您的案例中最大的影响来自于使用类似扫描的输入例程进行浮点解码,辅之以缓慢(重复)的 io 调用,但它需要一些重要的分析来证明这一点。

关于haskell - 为什么我的 IO 在 Erlang 中运行得这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7229411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com