2011-08-29 2 views
8

私はErlangプログラムにテキストファイルで書かれた512^2個の空白で区切られた倍音をstdinにパイプすることで読み込んでいます。私のIOはErlangでどうゆっくり動くのですか?

これは2m25sで、それと同等の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. 

ハスケル:任意の助けのために非常に多くの

module IOTest (
    main 
) where 

main :: IO() 

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

感謝。

+0

また、Erlangプログラムが逆の数のリストを生成するように見えます。 – augustss

答えて

9

いいえ、あなたは愚かな方法でErlang IOを使用していません。高速であることはよく知られていないErlang IOの問題です。 Erlangはサーバを書くのに広く使われているので、ソックされた指向のIOは優れたチューニングをしています。ブロック指向のファイルIOはそれほど悪くはありませんが、stdinを扱うのにioモジュールを使用するとうまく動作しません。 Erlangはこの種の作業に広く使われていません。この種の操作が必要な場合は、独自の特殊な入力ルーチンを作成する必要があります。あなたはそこに2つのオプションがあります。生とバイナリモードでファイルから読み取るための

  1. 使用のIOをして、バイナリモジュールを使用して、入力を分割して、変換のためlist_to_float/1を使用しています。
  2. (たとえば、http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7ノートread/0の機能と、-noshell-noinputのvm呼び出しのパラメータで表示されているように)特殊なポート指向の標準入力ルーチンを使用し、最初のオプションと同じように続けます。
鉱山の意見で

(と私の以前の経験から)あなたのケースで最大の影響はフロートのためのスキャンなどの入力ルーチンを使用してから来ているが遅い(繰り返し)IO呼び出しによって出向デコード、それは証明するために、いくつかの非自明なプロファイリングが必要になりますそれ。

+0

ありがとうございます。私はプログラムを2つの段階で実行するように修正しました。最初はファイルを読み込んでErlangの用語として保存します。私が実際に自分のプログラムを実行すると、Erlangという用語が読み込まれ、数秒で実行できます。 –