2011-03-01 105 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:我懷疑,是的。 –