下面是添加二进制字节的简单实现.根据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).
更优雅的解决方案是:
calc_checksum(<<W:16/little,Rest/bytes>>, Acc0) ->
    Acc1 = Acc0 + W,
    calc_checksum(Rest, Acc1);
calc_checksum(<<>>, Acc) -> Acc band 16#FFFF.
如果二进制包含奇数个字节,则此代码将生成错误.使用模式匹配通常可以提供更优雅的代码.
| 归档时间: | 
 | 
| 查看次数: | 523 次 | 
| 最近记录: |