Erlang 文件 IO 和异步线程

Tha*_*dis 2 io erlang asynchronous

我正在阅读有关文件io的 erlang 文档,看到了这个:

在支持线程的操作系统上,可以让文件操作在自己的线程中执行,从而允许其他 Erlang 进程继续与文件操作并行执行。请参阅 erl(1) 中的命令行标志 +A。

所以我期望的是,如果我添加异步线程,IO操作所需的时间将会减少。
相反,当我尝试运行erl +A1, erl +A6or erl +A12(在 6 核机器上)时,写入文件所需的时间增加了 5-10 倍。

我曾经timer:tc/3测量时间,并在使用标志打开文件时使用io:write/2, file:write/2(将术语转换为二进制)和。该术语大小约 170kb,被写入 1000 次。使用 R14B04(但我用 R15A 也得到了类似的结果)。file:write/2raw

我在使用异步 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).
Run Code Online (Sandbox Code Playgroud)

我对最小化 IO 开销(基本上只是输出)感兴趣,因为我想在分析过程中将一些数据写入磁盘;这就是为什么将数据发送到其他进行写入的进程没有帮助(除非我可以以某种方式将核心投入到进程中)。到目前为止,最好的方法似乎是打开一个原始文件,积累数据然后写入;任何提示将不胜感激:)

Luk*_*kas 5

当我运行测试时,使用 +A1 和不使用 +A1 时得到的性能大致相同。这是在具有双核处理器的 OS X Snow Leopard 上。这也是我使用异步线程所期望的。

添加异步线程只会添加额外的线程来执行 IO,从而提高并行 IO 作业的性能,并且它还允许正常的 erlang 进程以更快的速度运行,因为进程线程不忙于执行 IO 作业。

如果您使用许多并行作业运行测试,您应该会看到使用异步线程带来的性能提升。

然而,为什么您在顺序测试中看到性能下降仍然是一个谜。