チェックサム計算の高速化:情報発信すると教えてもらえるのもうれしいこと!
一昨日、「10Gイーサーを実際に使ってみた」 の記事で、チェックサム計算がスピードの影響している、と書いたところ、WIDEプロジェクト以来のお友達(と呼んでいいのかな?)の山本和彦さんから、
「IPチェックサムの計算は、桁数に依存しないので、4バイトごとに計算しているようなら、8バイト単位(そのハードで一番自然な単位の意味)で計算すると速くなるかもしれません。」
とコメントをいただいたので、早速実験してみました。ついでに、RFC1071に出ているソース、種田君がどこかから見つけてくれたソースも合わせて、5パターンで速度計測をしてみました。
64ビット環境
% cumulative self self total
time seconds seconds calls ms/call ms/call name
36.47 4.95 4.95 501 9.88 9.88 checksumRFC ←RFC1071に出ているソース
29.37 8.93 3.99 501 7.96 7.96 do_csum ←種田君からもらったソース
18.72 11.47 2.54 501 5.07 5.07 checksum16 ←自作16ビット単位
9.54 12.77 1.30 501 2.58 2.58 checksum32 ←自作32ビット単位
5.62 13.53 0.76 501 1.52 1.52 checksum64 ←自作64ビット単位
32ビット環境
% cumulative self self total
time seconds seconds calls ms/call ms/call name
28.39 4.59 4.59 501 9.16 9.16 checksum16
23.74 8.42 3.84 501 7.66 7.66 checksumRFC
20.76 11.78 3.36 501 6.70 6.70 do_csum
13.64 13.98 2.20 501 4.40 4.40 checksum32
13.64 16.19 2.20 501 4.40 4.40 checksum64
64ビット環境だと、断然64ビット単位で計算するものが速いですね!32ビット環境だと同じか、場合によっては32ビット単位の方が速い感じでした。条件コンパイルで使い分ける感じでいけそうです。
もともとは16ビット単位で計算していました。確かどこかで見つけたソースを流用して使っている感じだったと思いますが、実は他の製品とかでも使っているので、入れ替えると性能がUPするかもしれません(もっとも、10Gでリンクする製品は今のところ他にないので、誤差の範囲かもしれませんが)。
今回のシステムでは、64ビット単位版と、さらに差分計算を組み込んで高速化できそうです。
なお、64ビット単位で計算する場合は、それ以上大きな整数型がないので、桁あふれに注意しながら計算するようにしないと計算結果が間違えるので、自作する方は注意しましょう。
情報発信すると、誰かの役に立つこともあると同時に、こうやって教えていただけるのもうれしいことですね。
山本さん、ありがとうございます!