1. 要遍历map,我们可以用 maps:fold/3 , 或者先用 maps:to_list/1 然后再用 lists:foldl/3 ,maps:fold/3 的性能更好
2. 需要加工后的数据依然是一个map, 可以直接构建 map , 也可以先构建 list 再 maps:from_list/1 转成 map, 后一种方式性能更好
3. 测试代码
-module(t).
-export([t/0]).
t() ->
Data = [1, 2, 3, 4, 5, 6],
Map = lists:foldl(fun(Id, Tmp) ->
Tmp#{Id => Data}
end, #{}, lists:seq(1, 1000000)),
Fun1 = fun() ->
maps:from_list(lists:foldl(fun({Key, Val}, AccIn) ->
[{Key, [7 | Val]} | AccIn]
end, [], maps:to_list(Map)))
Fun2 = fun() ->
maps:fold(fun(Key, Val, AccIn) ->
AccIn#{Key => [7 | Val]}
end, #{}, Map)
Fun3 = fun() ->
maps:from_list(maps:fold(fun(Key, Val, AccIn) ->
[{Key, [7 | Val]} | AccIn]
end, [], Map))
{Time1, _} = timer:tc(Fun1),
io:format("Time1: ~p~n", [Time1]),
{Time2, _} = timer:tc(Fun2),
io:format("Time2: ~p~n", [Time2]),
{Time3, _} = timer:tc(Fun3),
io:format("Time3: ~p~n", [Time3]),
4. 输出结果
Time1: 437006
Time2: 656009
Time3: 297004
在 Erlang 中,元组、列表、字典和集合是常用的数据结构,它们分别适用于不同的场景和需求。在实际开发中,根据具体的问题和需求,选择合适的数据结构来存储和处理数据,可以提高代码的可读性和性能。Erlang 中的集合是基于红黑树实现的,可以通过模式匹配和内置函数来操作集合。在构造一个新的列表的时候,如果新的列表引用了其他列表,那么引用了其他列表的元素本身就是一个 Cons 单元格。Erlang 中的列表是可变的,可以使用模式匹配和内置函数来操作列表。列表的元素可以是任何类型的数据,也可以包含其他列表。
本文讲到的map是OTP17版本的map,OTP18进行一次map的优化。
在erl_map.h中有结构体的定义,代码如下:
typedef struct map_s {
Eterm thing_word;
Uint size;
Eterm keys; /* tuple */
} map_t;
/* map node
* Keys是一个tuple,存储着所有的Key
* 紧跟结构体后面的一块连续内存用于存储对应的Val
* -----------
lists ,maps和record是erlang最为常用的数据结构,lists使用方便简单,maps则查询高效,record则需要预定义,可扩展性差,各有各的优。本文做一下lists和maps的性能对比(再对比一下dict),代码如下(record操作不便则不做比较)。
%%通过注释部分代码做以下测试
%%timer:tc(lib_test, test_struct, [10000...
一,带函数Pred
1, all(Pred, List) -> boolean()
如果List中的每个元素作为Pred函数的参数执行,结果都返回true,那么all函数返回true,
否则返回false
lists:all(fun(E) -> true end,[1,2,3,4]).
2, any(Pred, List) -> boolean()
{ok, Cwd} = file:get_cwd().
Filelist = filelib:fold_files( Cwd, ".*", true, fun(File, Acc) -> [File|Acc] end, []).
io:format("~p", [Filelist]).
这篇文章主要介绍了Erlang中的基本元素操作小结,本文讲解了元组(tuple)、记录(record)、列表(list)、映射组(map)等内容,需要的朋友可以参考下
Erlangshell中,用句号加空格、tab或回车来结束表达式,%表示注释的起点,;隔离子句。模块是.erl 文件,库的头文件.hrl, shell中的编译时c(),外编译命令时erlc, 退出shell用q(),或erlang:halt().
变量以大写字母开头,且不能重新绑定变量,只能一次性赋值,具有不可变状态。原子是全局的,不.
Erlang是一种用于构建并发、分布式和容错系统的函数式编程语言。它最初是为电信系统而开发的,随着时间的推移,Erlang逐渐被广泛应用于各种需要高可用性和可靠性的系统中。在Erlang中,数据结构承载着程序的状态和行为,合理的选择和使用数据结构能够有效提高程序的可读性、可维护性和性能。本文将详细探讨Erlang中的基本数据结构,包括元组、列表、映射和二进制数据,分析它们的特性、应用场合及其性能特点,并结合实例来阐明如何在实际开发中合理使用这些数据结构。