私はおよそfile IO Erlangのドキュメントを読んでいたファイルと、これは見た:アーランはIOおよび非同期スレッド
スレッドをサポートしているオペレーティング・システムで、ファイル 操作は、独自のスレッドで実行させることが可能です他のErlang プロセスをファイル操作と並行して実行し続けることができます。 erl(1)のコマンドラインフラグ+ Aを参照してください。
私が期待したことは、非同期スレッドを追加するとIO操作に必要な時間が短縮されるということでした。
の代わりに、erl +A1
,erl +A6
またはerl +A12
(6コアマシンで)を実行しようとすると、ファイルに書き込むのに必要な時間が5〜10倍に増加しました。
私は時間を測定するtimer:tc/3
を使用し、raw
フラグでファイルを開くときに、私はio:write/2
、file: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のオーバーヘッド(基本的には出力)を最小化することに興味を持っています。そのため、書き込みを行う他のプロセスにデータを送信することは役に立ちません(何らかの理由でコアをプロセスに使用できない限り)。これまでのところ、最良の方法は、生のファイルを開いてデータを蓄積してから書き込むことです。任意のヒントをいただければ幸いです:)
これは間違いなく、なぜシリアルI/Oでスピードアップがうまくいかなかったのかを説明するものです。 –