我已经了解了IO列表的效率。但是,我仍然无法将其包裹住。
IO列表的嵌套到底比串联字符串更有效。
当有很多重复的单词时,IO列表到底有多有效?
我已将此 链接用作参考。
免责声明:我将使用Erlang语法,因为即使在Elixir中,它也是在BEAM VM中完成的方式。
如果您有两个列表,LM且LN长度为M和N。然后追加LM ++ LN是O(M)操作。[LM|LN]是O(1)操作。如果您有两个二进制文件BM,BN然后<<BM/binary, BN/binary>>是O(M+N)operation并且[BM|BN](是,它是有效的io_list。)仍在O(1)运行。
重复相同W长度的字(W无论它是列表还是二进制),N使用lists:duplicate(N, W)is 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)).
Run Code Online (Sandbox Code Playgroud)
并且将花费30倍的[_|_]运行时间,并消耗31 * 2 * 8B,即496B的内存(在64b平台上占一半,在32b上)。如果将其作为二进制文件来执行,则它将占用2GB的内存和32GB的平面列表(在64b上为16GB,在32b上为16GB)。祝你好运。