2011-03-01 64 views
2

此问题特定于Erlang,但可能对其他IO库有一般意义。在Erlang中,我可以编写io:format(IOF, "data: ~p", [Data]),它会将变量Data的内容打印到文件IOF指向的地方。我的问题是这样的:更好还是更高效地选择很多小型的io:format()调用,还是一个巨大的调用?例如,什么会更快?出于演示的目的,假设我Data变量的大小是每个1KB在大小和N > 100,000Erlang io:格式缓冲和效率

场景A:

io:format(IOF, "data1: ~p", [Data1]) 
io:format(IOF, "data2: ~p", [Data2]) 
... 
io:format(IOF, "dataN: ~p", [DataN]) 

方案B:

io:format(IOF, "data1: ~p data2: ~p ... dataN: ~p", [Data1, Data2, ..., DataN]) 

如果这种差别是微不足道的我我不是很感兴趣,但如果可能会有很大的差异,那么我有兴趣知道为什么。

+0

io&io_lib是有史以来最慢的狗屎。考虑使用日志库或对原始文件进行快速操作。 – user425720

+0

为什么它会变慢,为什么使用第三部分日志记录库会更快? –

+0

我不熟悉内部实现。 IO一直是Erlang的性能问题,相信我io和io_lib会影响你的系统。使用fprof(profiler)来查看这些函数有多高。 – user425720

回答

2

我建议你研究file:open/2模式,其中之一是{delayed_write, Size, Delay}。它允许您缓冲数据并将其有效写入设备。

这种方式或者调用不会造成巨大的差异。

+0

因此,无论调用多少个io:格式调用,delay_write都会让我指定在转储之前要将多少字节加载到缓冲区中? –

+0

@ Travis:我怀疑,是的。 –