2011-08-29 48 views
8

我正在閱讀512^2空格分隔的雙打文本文件,通過將它們傳遞給標準輸入到我的Erlang程序中。在愛爾蘭,我的IO如何緩慢運行?

在Erlang中,這需要2m25s,在等價的Haskell程序中需要3s,所以我必須以某種方式違背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並沒有那麼糟糕,但是使用io模塊來處理stdin並不能很好地工作。 Erlang沒有被廣泛用於這種工作。如果你需要這種操作,你應該編寫你自己的專用輸入程序。您有兩個選項有:

  1. 使用IO從文件在原二進制模式讀取,然後使用二進制模塊,然後使用list_to_float/1轉換拆分輸入。
  2. 使用專門的面向端口的stdin讀取例程(例如您可以在http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7 note中注意read/0函數和-noshell-noinput vm調用的參數),然後繼續執行第一個選項。

在我的意見(和我的以往的經驗),你的情況最大的影響來自於利用浮法掃描般的輸入程序對由慢(重複)10調用借調,但它會需要一些平凡的分析來證明它。

+0

謝謝。我修改了我的程序,分兩個階段運行,第一個階段讀取文件,然後將其保存爲Erlang術語。當我真正運行我的程序時,它現在讀取Erlang術語,它可以在幾秒鐘內完成。 –