Asynchronous Erlang文件IO和异步线程

Asynchronous Erlang文件IO和异步线程,asynchronous,io,erlang,Asynchronous,Io,Erlang,我正在阅读关于io的erlang文档,看到了以下内容: 在支持线程的操作系统上,可以让文件 操作可以在自己的线程中执行,允许其他Erlang 继续与文件操作并行执行的进程。 请参见erl(1)中的命令行标志+A 因此,我所期望的是,如果添加异步线程,IO操作所需的时间将减少。 相反,当我尝试运行erl+A1,erl+A6或erl+A12(在6核机器上)时,写入文件所需的时间增加了5-10倍 我使用timer:tc/3来测量时间,并使用io:write/2、file:write/2(将术语转换为二

我正在阅读关于io的erlang文档,看到了以下内容:

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

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

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

在使用异步IO或测量其效率时,我是否做错了什么

是否通过传递该术语(可能是因为它的大小很小)而引入的开销超过了所获得的加速比

(不太优雅:$)代码:


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

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

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

如果使用多个并行作业运行测试,您应该会看到使用异步线程的性能提高


但是,为什么在顺序测试中看到性能下降是个谜

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

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

如果使用多个并行作业运行测试,您应该会看到使用异步线程的性能提高


但是,为什么在顺序测试中看到性能下降是个谜

哦,这绝对解释了为什么串行IO中没有任何加速,谢谢!哦,这绝对解释了为什么串行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).