Optimization 记录是如何存储在erlang中的,它们是如何变异的?

Optimization 记录是如何存储在erlang中的,它们是如何变异的?,optimization,erlang,Optimization,Erlang,我最近遇到了一些类似于以下内容的代码: -record(my_rec, {f0, f1, f2...... f711}). update_field({f0, Val}, R) -> R#my_rec{f0 = Val}; update_field({f1, Val}, R) -> R#my_rec{f1 = Val}; update_field({f2, Val}, R) -> R#my_rec{f2 = Val}; .... update_field({f711, Val

我最近遇到了一些类似于以下内容的代码:

-record(my_rec, {f0, f1, f2...... f711}).

update_field({f0, Val}, R) -> R#my_rec{f0 = Val};
update_field({f1, Val}, R) -> R#my_rec{f1 = Val};
update_field({f2, Val}, R) -> R#my_rec{f2 = Val};
....
update_field({f711, Val}, R) -> R#my_rec{f711 = Val}.

generate_record_from_proplist(Props)->
    lists:foldl(fun update_field/2, #my_rec{}, Props).
我的问题是关于记录的实际情况-假设记录有711个字段,我从一个proplist生成它-因为记录是不可变的,我们至少在语义上,在foldr中每一步生成一个新的完整记录-生成一个看起来像是在参数长度上呈线性的函数,变成一个长度实际上是二次的,因为每次插入都会有与记录长度相对应的更新-我的假设正确吗,或者编译器足够智能吗
要救我吗?

恐怕编译器不够聪明。
你可以在这本书里读到更多。如果您有这么多的字段,并且希望在O(1)时间内更新它,那么您应该使用。

恐怕编译器不够智能。
你可以在这本书里读到更多。如果您有这么多的字段,并且希望在O(1)时间内更新它,您应该使用。

记录是元组,第一个元素包含记录的名称,下一个元素包含记录字段

字段的名称不存储,它是编译器的工具,当然还有程序员的工具。我认为它的引入只是为了避免在编写程序时字段顺序出现错误,并且在发布新版本时允许tuple扩展,而无需重写所有模式匹配


您的代码将创建713元素元组的712个副本。

记录是元组,第一个元素包含记录的名称,下一个元素包含记录字段

字段的名称不存储,它是编译器的工具,当然还有程序员的工具。我认为它的引入只是为了避免在编写程序时字段顺序出现错误,并且在发布新版本时允许tuple扩展,而无需重写所有模式匹配


您的代码将创建713元素元组的712个副本。

可能重复的可能重复的可能重复的可能重复的我给了您pascal点-但我仍然想知道,erlang vm是将记录存储在一个内存块中,还是将元组存储在树状结构中,让更新变得不那么痛苦,然后从头开始重建整个记录,如果这是第二个选项,代码vm将能够重用大量引用。您可以在此处阅读有关内部表示的更多信息:看起来记录是连续的内存块。我正在查找此文档,但是@tkowal比我快得多:o)我给了你帕斯卡的分数-但我还是想知道,erlang虚拟机是将记录存储在一块内存中,还是将元组存储在树状结构中,使更新过程不那么痛苦,然后从头开始重建整个记录,若这是第二个选项,代码vm将能够重用大量引用。您可以在此处阅读更多关于内部表示的信息:看起来记录是连续的内存块。我正在查找此文档,但@tkowal比我快得多:o)