【发布时间】:2011-11-04 16:37:52
【问题描述】:
给定:
-record(foo, {a, b, c}).
我会这样做:
Thing = #foo{a={1,2}, b={3,4}, c={5,6}},
Thing1 = Thing#foo{a={7,8}}.
从语义上看,Thing 和 Thing1 是唯一的实体。但是,从语言实现的角度来看,制作 Thing 的完整副本来生成 Thing1 会非常浪费。例如,如果记录的大小为 1 MB,而我制作了 1000 个“副本”,每个“副本”都修改了几个字节,那么我就烧掉了 1 GB。如果内部结构跟踪父结构的表示,并且每个派生以指示其自己的更改但保留其他所有人的版本的方式标记该父级,则可以以最小的内存开销创建派生。
我的问题是:erlang 是否在内部做任何聪明的事情来保持通常的 erlang 涂鸦的开销;
Thing = #ridiculously_large_record,
Thing1 = make_modified_copy(Thing),
Thing2 = make_modified_copy(Thing1),
Thing3 = make_modified_copy(Thing2),
Thing4 = make_modified_copy(Thing3),
Thing5 = make_modified_copy(Thing4)
...至少?
我问是因为如果是这种情况,我进行跨进程通信的方式会有很多变化。
【问题讨论】:
标签: memory erlang record internals