vlambda博客
学习文章列表

[erlang] 几乎相同的语句,执行耗时差几倍?

【问题情景】

    




    现在有如上4张dets表,每个都是300w数据左右然后进行如下两个操作

    操作一: 遍历4张表 + dets:select:

[erlang] 几乎相同的语句,执行耗时差几倍?

可以看到耗时292秒。


    操作二: 遍历4张表 + dets:select + maps:put

[erlang] 几乎相同的语句,执行耗时差几倍?

可以看到耗时1433秒。


这是什么情况?同样的操作,只是加了一个maps:put,竟然相差5倍的时间,我们知道maps只是内存操作,没理由这么慢,再仔细看看,难道是dets:select的问题,好像也没什么道理,两者都是同样的机器,一样的参数,那怎么时间会相差这么远?大家可以思考看看。











我将操作二放入独立的进程[pid是<0.3260.5>]中,在他执行过程中,不断的查看内存,发现内存会稳步增长。偶尔又会回落一些,最终增长到1G多,起起伏伏,说明什么?对了,进程在进行GC


    【结论】: 并不是两者的dest:select有差别,或者lists:foreach与lists:foldl有性能差异,或者maps操作非常的慢的问题,而是如果进程内使用了大量的内存,而dests:select也是需要使用一定的内存的,所以需要花费大量的时间去GC,导致了两者耗时相差甚远。


【延伸思考】: erlang进程GC频率如何,会因为内存暴增加大GC频率吗?