2017-03-16 33 views
1

我已閱讀了關於IO列表的效率。不過,我仍然無法將頭圍繞在它周圍。elixir中的IO列表效率/ erlang

  1. 究竟是怎麼築巢IO名單不是連接字符串 更有效。

  2. 當有很多重複單詞時,IO列表究竟如何更高效。

我已經使用this鏈接作爲參考。

回答

4

聲明:我將使用Erlang語法,因爲它是如何在BEAM VM中完成的,即使在Elixir中也是如此。

  1. 如果你有兩個列表LM和長度MNLN。然後追加LM ++ LN即爲O(M)操作。 [LM|LN]O(1)的操作。如果你有兩個二進制文件BMBN那麼<<BM/binary, BN/binary>>O(M+N)操作和[BM|BN](是的,它是有效的io_list。)仍然是O(1)操作。

  2. 重複長度W的相同的字W無論它是列表或二進制的,使用lists:duplicate(N, W)重複N倍是O(N)操作和它消耗O(N)附加存儲器即整個存儲器是O(N+W)。如果你平坦的話,將花費O(N*W)時間,並且它消耗O(N*W)內存。

例如:你可以使用這個讓2^31一長串的x(不要在shell中輸入它!):

lists:foldl(fun(_, X) -> [X|X] end, "x", lists:seq(1, 30)). 

,而且需要的[_|_]運行時間的30倍,消耗31 * 2 * 8B即496B的內存(在64b平臺上,一半在32b上)。如果你將它作爲二進制文件,它將佔用2GB內存和32GB作爲一個扁平列表(在64b和32b上的16GB)。祝你好運。

+0

謝謝。它有很多幫助,但請您詳細說明這兩點的複雜性分析? –