Erlang:更快速地对二进制文件中的字节进行求和

Gab*_*iMe 3 erlang

下面是添加二进制字节的简单实现.根据eprof它很慢(大约占总时间的10% - 主要是因为许多电话binary:part/3).

怎样才能得到优化?

calc_checksum(Packet) when is_binary(Packet)->  
    calc_checksum(Packet, 0).

calc_checksum(<<>>, Acc) -> 
    Acc band 16#FFFF;

calc_checksum(Packet, Acc) when is_binary(Packet) ->        
    W = binary:decode_unsigned(binary:part(Packet, 0, 2), little),
    NextAcc = Acc + W,
    NextBytes = binary:part(Packet, byte_size(Packet), -(byte_size(Packet)-2)),
    calc_checksum(NextBytes, NextAcc).
Run Code Online (Sandbox Code Playgroud)

rvi*_*ing 8

更优雅的解决方案是:

calc_checksum(<<W:16/little,Rest/bytes>>, Acc0) ->
    Acc1 = Acc0 + W,
    calc_checksum(Rest, Acc1);
calc_checksum(<<>>, Acc) -> Acc band 16#FFFF.
Run Code Online (Sandbox Code Playgroud)

如果二进制包含奇数个字节,则此代码将生成错误.使用模式匹配通常可以提供更优雅的代码.