有两种算法实现:
average(List) -> sum(List) / len(List).
sum([]) -> 0;
sum([Head | Tail]) -> Head + sum(Tail).
len([]) -> 0;
len([_ | Tail]) -> 1 + len(Tail).
average1(List) -> average_acc(List, 0,0).
average_acc([], Sum, Length) -> Sum / Length;
average_acc([H | T], Sum, Length) -> average_acc(T, Sum + H, Length + 1).
和跟踪GC事件的输出gc_start gc_end(gc启动和停止):
此处的每个下一个值都是前一个值和最后一个gc时间的总和
平均分:5189 平均值:14480 平均值:15118average1:594
为什么这么大的区别?
PS。我使用挂钟时间。
答案 0 :(得分:2)
timestamp
标志)来测量GC所采用的内容,因为即使GC未在Erlang调度程序线程中重新调度,线程自身也可以由底层操作系统重新调度。所以你应该使用cpu_timestamp
代替。average/1
正在使用sum/1
和count/1
实施,其中不是尾递归,因此您可以分配2*N
堆叠帧,这会产生很大的不同性能为average1/1
,使用尾递归average_acc/3
。因此average1/1
与其他语言的循环完全相同。timestamp
标志来跟踪消息。