erlang 怎样遍历map性能最好

 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)))
    end,
    Fun2 = fun() ->
        maps:fold(fun(Key, Val, AccIn) ->
            AccIn#{Key => [7 | Val]}
        end, #{}, Map)
    end,
    Fun3 = fun() ->
        maps:from_list(maps:fold(fun(Key, Val, AccIn) ->
            [{Key, [7 | Val]} | AccIn]
        end, [], Map))
    end,
    {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]),
    ok.

4. 输出结果

Time1: 437006
Time2: 656009
Time3: 297004

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值