2011-08-29 45 views
8

512^2 beyaz boşluklu bir metin dosyasında yazdığım iki boyutlu boşluklarımı Erlang programına yazarak stdin'e aktarıyorum.IO'm neden Erlang'da bu kadar yavaş çalışıyor?

Erlang'da bu 2m25s, eşdeğer bir Haskell programında 3s alır, bu yüzden Erlang yoluna bir şekilde karşı çıkmalıyım.

Erlang'ın IO temel öğelerini aptal bir şekilde mi kullanıyordum yoksa programımda başka bir sorun var mı?

Elde edilen listedeki değerlerin sırasını umursamıyorum, bu yüzden geri işlem yok.

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: herhangi bir yardım için çok

module IOTest (
    main 
) where 

main :: IO() 

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

teşekkürler.

+0

Ayrıca, Erlang programının tersi olarak sayıların listesini üreteceği anlaşılıyor. – augustss

cevap

9

Hayır, Erlang IO'yu aptalca kullanmıyorsunuz. Hızlı olması iyi bilinen Erlang IO ile sorun. Erlang yaygın olarak kullanılan sunucular yazmak için yaygın olarak kullanılan IO mükemmel ayarlanmış. Blok yönelimli dosya IO çok kötü değil, ancak stdin ile çalışmak için io modülünü kullanmak iyi çalışmıyor. Erlang bu tür işler için yaygın olarak kullanılmamaktadır. Bu tür işlemlere ihtiyacınız varsa, kendi özel giriş rutininizi yazmalısınız. Orada iki seçenek vardır: çiğ ve ikili modda dosyadan okuma için

  1. kullanım io ve ardından ikili modülü kullanarak ve sonra dönüşüm için list_to_float/1 kullanmak girişi bölün. (Eğer http://shootout.alioth.debian.org/u64q/program.php?test=regexdna&lang=hipe&id=7 notta örneğin read/0 fonksiyonu ve vm ayin için -noshell-noinput parametrelerini görebileceğiniz gibi) ve daha sonra ilk seçenek olarak devam
  2. kullanımı uzmanlaşmış liman odaklı Stdin okuma rutin.
mayın Sizce

(ve benim önceki deneyim itibaren) sizin durumunuzda büyük darbe şamandıra için tarama benzeri girdi rutin kullanarak gelen yavaş (Mükerrer) io çağırma tarafından desteklenmesi yoluyla kod çözme, ancak kanıtlamak için bazı nontrivial profil gerekir o.

+0

Teşekkürler. Programımı ilk olarak dosyayı okuyan ve daha sonra bir Erlang terimi olarak kaydettiği iki aşamada çalışacak şekilde değiştirdim. Programımı çalıştırdığımda, şimdi saniyeler içinde yapabileceği Erlang terimini okur. –

İlgili konular