2011-08-29 15 views
8

Tôi đang đọc 512^2 khoảng trống được phân cách bằng dấu cách trắng được viết trong một tệp văn bản vào chương trình Erlang của tôi bằng cách đặt chúng vào tiêu chuẩn.Làm thế nào đến IO của tôi chạy quá chậm trong Erlang?

Trong Erlang điều này mất 2m25s, trong một chương trình Haskell tương đương phải mất 3s, vì vậy tôi phải đi ngược lại cách Erlang để làm điều đó theo một cách nào đó.

Tôi có sử dụng nguyên mẫu IO của Erlang theo cách ngu xuẩn hay có vấn đề gì khác với chương trình của tôi không?

Lưu ý rằng tôi không quan tâm đến thứ tự của các giá trị trong danh sách kết quả, do đó không có hoạt động ngược lại.

Erlang:

-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() 

Cảm ơn rất nhiều sự giúp đỡ nào.

+0

Dường như chương trình Erlang sẽ tạo danh sách các số ngược lại. – augustss

Trả lời

9

Không, bạn không sử dụng Erlang IO theo cách ngu xuẩn. Đó là vấn đề với Erlang IO mà không được biết đến là nhanh. Erlang được sử dụng rộng rãi cho các máy chủ viết nên socked định hướng IO là tuyệt vời điều chỉnh. Khối tập tin định hướng IO không phải là quá xấu, nhưng sử dụng mô-đun io để làm việc với stdin không hoạt động tốt. Erlang không được sử dụng rộng rãi cho loại công việc này. Nếu bạn cần loại hoạt động này, bạn nên viết thói quen đầu vào chuyên ngành của riêng mình. Bạn có hai lựa chọn đó:

  1. sử dụng io cho việc đọc từ tập tin trong chế độ thô và nhị phân và sau đó tách đầu vào sử dụng mô-đun nhị phân và sau đó sử dụng list_to_float/1 để chuyển đổi.
  2. sử dụng thường xuyên theo định hướng đọc stdin theo định tuyến (như bạn có thể xem ví dụ trong http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7 lưu ý read/0 chức năng và -noshell-noinput tham số cho yêu cầu vm) và sau đó tiếp tục như trong tùy chọn đầu tiên.

Theo quan điểm của tôi (và từ kinh nghiệm trước đây của tôi) tác động lớn nhất trong trường hợp của bạn đến từ việc sử dụng quy trình nhập giống như quét để giải mã trôi nổi chậm trễ (lặp lại), nhưng cần một số hồ sơ không cần thiết để chứng minh nó.

+0

Cảm ơn. Tôi đã sửa đổi chương trình của tôi để chạy trong hai giai đoạn, nơi lần đầu tiên đọc tệp và sau đó lưu nó dưới dạng thuật ngữ Erlang. Khi tôi thực sự chạy chương trình của tôi, nó bây giờ đọc thuật ngữ Erlang, mà nó có thể làm trong vài giây. –

Các vấn đề liên quan