2012-01-15 17 views
1

私はおよそfile IO Erlangのドキュメントを読んでいたファイルと、これは見た:アーランはIOおよび非同期スレッド

スレッドをサポートしているオペレーティング・システムで

、ファイル 操作は、独自のスレッドで実行させることが可能です他のErlang プロセスをファイル操作と並行して実行し続けることができます。 erl(1)のコマンドラインフラグ+ Aを参照してください。

私が期待したことは、非同期スレッドを追加するとIO操作に必要な時間が短縮されるということでした。
の代わりに、erl +A1,erl +A6またはerl +A12(6コアマシンで)を実行しようとすると、ファイルに書き込むのに必要な時間が5〜10倍に増加しました。

私は時間を測定するtimer:tc/3を使用し、rawフラグでファイルを開くときに、私はio:write/2file:write/2(バイナリに用語を変換)とfile:write/2を用います。期間は〜170kbのサイズで、1000回書かれました。使用されたR14B04(ただし、R15Aでも同様の結果が得られました)。

私は非同期IOを利用しているか、効率を測定していますか?

用語を渡すことによって導入されたオーバーヘッド(おそらくサイズが小さいため)が、スピードアップのアウトウェイトを増やすことができますか?

(ではないので、エレガント:$)コード:

-module(test). 
-compile(export_all). 

test()-> 
    {ok,F}=file:open(foo,[raw,write]),   % or just [write] 
    {T,ok}=timer:tc(test,t,[F,1000]), 
    file:close(F), 
    T. 

t(_,0)->ok; 
t(F,A)-> 
    B=dsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdfdsafasfagafssadagfsdsaasdf, 

    file:write(F, 
term_to_binary([B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B,B])), 
%or io:write(F,[B,..]) 
    t(F,A-1). 

私はプロファイリング中にディスクにいくつかのデータを書きたいので、私はIOのオーバーヘッド(基本的には出力)を最小化することに興味を持っています。そのため、書き込みを行う他のプロセスにデータを送信することは役に立ちません(何らかの理由でコアをプロセスに使用できない限り)。これまでのところ、最良の方法は、生のファイルを開いてデータを蓄積してから書き込むことです。任意のヒントをいただければ幸いです:)

答えて

4

私がテストを実行すると、私は+ A1を使用して、ほぼ同じ性能を得ます。これは、OS X Snow Leopardにデュアルコアプロセッサを搭載しています。これは、私が非同期スレッドを使用すると予想されるものです。

非同期スレッドを追加すると、IOを実行するスレッドが増え、並列IOジョブのパフォーマンスが向上します。また、プロセススレッドがIOジョブを実行していないため、通常のerlangプロセスを高速で実行できます。

多くの並列ジョブでテストを実行する場合は、非同期スレッドを使用するとパフォーマンスが向上するはずです。

逐次テストでパフォーマンスが低下するのはなぜかというと謎です。

+0

これは間違いなく、なぜシリアルI/Oでスピードアップがうまくいかなかったのかを説明するものです。 –

関連する問題