<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Javier París Fernández wrote:
<blockquote cite="mid20040921171917.GA24469@dc.fi.udc.es" type="cite">
  <pre wrap="">On Tue, Sep 21, 2004 at 09:45:05AM -0700, Thomas Lindgren wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">The C code will be difficult to beat in this sort of
program. I can't see any obvious way to improve on the
program above either. (Though I wonder if you really
want '+' or 'bxor' in the above?)
    </pre>
  </blockquote>
  <pre wrap=""><!---->
It's the Tcp checksum, and it is defined that way in the 
rfc. I agree that it is a bit strange.
  </pre>
</blockquote>
I'm no Tcp expert, but are you sure?<br>
Is it not defined as the 16-bit 1's complement sum? <br>
I.e. something like:<br>
'+'(A,B) -><br>
    S = A + B,<br>
    S band 16#ffff + (S bsr 16).<br>
<br>
One problem with your code is that it generates bignums (heap-allocated
large integers),<br>
but if it is the 16-bit 1's complement sum, then you don't need large
integers.<br>
<br>
You could also traverse the binary without creating new sub-binaries,
by keeping <br>
track of how many byte-pairs you have seen (N):<br>
<br>
c(N,Bin,Csum) -><br>
    case Bin of <br>
    <<_:N/binary, Num:16/integer,_/binary>> -><br>
        c(N+2,Bin,'+'(Csum,Num));<br>
        <<_:N/binary, Num:8/integer>> -><br>
        '+'(Csum,Num bsl 8);<br>
    _ -> Csum<br>
    end.<br>
<br>
Unfortunately even with these two changes the code does not become much
faster...<br>
I have attached a test program that calculates the checksum in 4
different ways,<br>
and prints the execution times in microseconds, but the function c/3
above is the fastest.<br>
<br>
/Erik<br>
 - I'm Happi, you should be happy.<br>
<br>
</body>
</html>