erlang精要(28)-递归与尾递归以及性能

260> learnerl:get_len(lists:seq(1,9000000)).       
{9000000,113350337,5560}
261> learnerl:get_len1(lists:seq(1,9000000),start).
mem:88270640
time:368943241
ok
286> learnerl:get_len(lists:seq(1,9000)).       
{9000,428772,9728}
287> learnerl:get_len1(lists:seq(1,9000),start).
mem:44720
time:756537
ok
28
-module(learnerl).
-export([get_sum/1,get_len/1,get_len1/2]).


get_len([],Count,Time,Mem)->
      {Count,get_time()-Time,erlang:memory(processes_used)-Mem};
get_len([_|T],Count,Time,Mem)->
      get_len(T,Count+1,Time,Mem).
get_len(L)->
      get_len(L,0,get_time(),erlang:memory(processes_used)).


get_len1([])->
      0;
get_len1([_|T])->
      1+get_len1(T).
get_len1(L,start)->
      Mem=erlang:memory(processes_used),
      Time=get_time(),
      get_len1(L),
      io:format("mem:~p~n",[erlang:memory(processes_used)-Mem]),
      io:format("time:~p~n",[get_time()-Time]).


get_time()->os:system_time().
    
get_sum([],Sum)->Sum;
get_sum([H|T],Sum)->get_sum(T,Sum+H).
get_sum(L)->get_sum(L,0).

其中,get_len是尾递归,get_len1是递归,可以看出,递归比尾递归更消耗内存与时间。

相关推荐
©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页