添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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中的基本数据结构,包括元组、列表、映射和二进制数据,分析它们的特性、应用场合及其性能特点,并结合实例来阐明如何在实际开发中合理使用这些数据结构。