我已閱讀了關於IO列表的效率。不過,我仍然無法將頭圍繞在它周圍。elixir中的IO列表效率/ erlang
究竟是怎麼築巢IO名單不是連接字符串 更有效。
當有很多重複單詞時,IO列表究竟如何更高效。
我已經使用this鏈接作爲參考。
我已閱讀了關於IO列表的效率。不過,我仍然無法將頭圍繞在它周圍。elixir中的IO列表效率/ erlang
究竟是怎麼築巢IO名單不是連接字符串 更有效。
當有很多重複單詞時,IO列表究竟如何更高效。
我已經使用this鏈接作爲參考。
聲明:我將使用Erlang語法,因爲它是如何在BEAM VM中完成的,即使在Elixir中也是如此。
如果你有兩個列表LM
和長度M
和N
的LN
。然後追加LM ++ LN
即爲O(M)
操作。 [LM|LN]
是O(1)
的操作。如果你有兩個二進制文件BM
和BN
那麼<<BM/binary, BN/binary>>
是O(M+N)
操作和[BM|BN]
(是的,它是有效的io_list
。)仍然是O(1)
操作。
重複長度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)。祝你好運。
謝謝。它有很多幫助,但請您詳細說明這兩點的複雜性分析? –