2011-08-29 4 views
8

나는 Erlang 프로그램에 텍스트 파일로 쓰여진 512^2 공백으로 구분 된 double을 stdin에 파이프하여 읽습니다.Erlang에서 IO가 너무 느리게 실행되는 이유는 무엇입니까?

얼랑 (Erlang)에서는 2m25s가 걸리고, 하스켈 프로그램에서는 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

아니, 당신은 바보 같은 방식으로 얼랭 IO를 사용하지 않습니다. 그것은 빠른 것으로 잘 알려져 있지 않은 Erlang IO의 문제입니다. 얼랭 (Erlang)은 서버 작성을 위해 널리 사용되기 때문에 socked 지향 입출력이 우수합니다. 블록 지향 파일 입출력은 그렇게 나쁘지 않지만 stdin을 사용하기 위해 io 모듈을 사용하면 잘 작동하지 않습니다. Erlang은 이러한 종류의 작업에 널리 사용되지 않습니다. 이런 종류의 조작이 필요한 경우에는 특수화 된 입력 루틴을 작성해야합니다. 당신은이 두 가지 옵션이 있습니다 : 원시 이진 모드에서 파일에서 읽기위한

  1. 사용 IO를 다음 바이너리 모듈을 사용하여 다음 변환 list_to_float/1을 사용하여 입력을 분할합니다.
  2. (예 : http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7 참고 read/0 참고 및 v2 호출의 경우 -noshell-noinput 매개 변수에서 볼 수 있듯이) 특수 포트 지향 표준 읽기 루틴을 사용하고 첫 번째 옵션에서와 같이 계속하십시오.
내 의견으로는

(그리고 내 이전의 경험에서) 귀하의 경우 가장 큰 영향은 플로트에 대한 검사와 같은 입력 루틴을 사용에서 비롯가 느린 (반복) IO 호출에 의해 파견 디코딩,하지만 증명할 수있는 사소 프로파일을 필요 그것.

+0

감사합니다. 프로그램이 두 단계로 실행되도록 수정했습니다. 첫 번째 파일은 파일을 읽은 다음 얼랭 (Erlang) 용어로 저장합니다. 실제로 프로그램을 실행할 때 얼랭 (Erlang) 용어를 읽습니다. 몇 초 안에 할 수 있습니다. –

관련 문제