gpt4 book ai didi

elixir - 在 Elixir 中构建长字符串的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-04 22:56:06 25 4
gpt4 key购买 nike

我想构建一个相对较长的字符串(如果重要,则为 SVG)并从函数中返回它。在 Elixir 中构建这样的字符串的最佳方法是什么?在其他语言中,我会使用类似 StringBuilder 类的东西。 Elixir 中是否有类似的东西?

您可以使用 <> 运算符附加字符串,但这不只是一个列表附加吗?似乎做很多这样的事情会变得非常低效。

最佳答案

Elixir 字符串(在 Erlang 中称为二进制文件)表示为内存中的连续字节序列,而不是字节/字符的链接列表,如果这就是“列表”的意思的话。它们是不可变的,附加两个二进制文件的简单实现将是 O(n+m)如果字符串的长度为 nm ,但 Erlang VM 优化了构建大字符串的用例:如果您有两个字符串,ab , 和 a分配后有空闲内存,并且您将它们连接起来( a <> b ),VM 只会复制 b并重用 a 的旧值.如果您稍后连接另一个字符串 c,由于显而易见的原因,将不会应用此优化。至 a ,但这种优化本身足以使构建大型二进制文件的任务与具有可变字符串的语言一样高效。本次优化详解here .

这是此优化操作的演示。在第一个示例中,我通过附加到基值来创建一个 10,000,000 字节的字符串。在第二个示例中,我通过添加一个基值来创建一个 500,000 字节的字符串,这比添加 10,000,000 个字节花费的时间多 10 倍。在一个简单的实现中,两者都需要相同的时间。

{time, _} = :timer.tc(fn ->
Enum.reduce(1..10_000_000, "", fn _, acc -> acc <> "." end)
end)

IO.inspect time

{time, _} = :timer.tc(fn ->
Enum.reduce(1..500_000, "", fn _, acc -> "." <> acc end)
end)

IO.inspect time
683621
7807815

简而言之,只要您只附加值,就应该可以构建大字符串。

如果您要将结果字符串写入套接字或流或类似内容,您可以通过创建 iolists 而不是平面字符串来显着更快地完成此操作。有关这些的更多信息 herehere .

关于elixir - 在 Elixir 中构建长字符串的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46095870/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com