为什么在两个实现中GC时间有如此大的差异

时间:2011-10-18 07:03:56

标签: garbage-collection erlang tail-recursion

有两种算法实现:

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   平均值:15118

     

average1:594

为什么这么大的区别?

PS。我使用挂钟时间。

1 个答案:

答案 0 :(得分:2)

  1. 您不应该使用挂钟时间(timestamp标志)来测量GC所采用的内容,因为即使GC未在Erlang调度程序线程中重新调度,线程自身也可以由底层操作系统重新调度。所以你应该使用cpu_timestamp代替。
  2. 您的average/1正在使用sum/1count/1实施,其中不是尾递归,因此您可以分配2*N堆叠帧,这会产生很大的不同性能为average1/1,使用尾递归average_acc/3。因此average1/1与其他语言的循环完全相同。
  3. 编辑:

    1. 根据Yola编辑说他正在使用timestamp标志来跟踪消息。