2006/02/18(Sat)「HSPが遅い」って書いたのは……

はてブ数 2006/02/18 5:18 プログラミング::HSP3 つーさ

記事「HSPを使う理由」で、「動作が遅い」って書いた理由です。
というか、「動作が遅い」ってイメージがついちゃってる理由です。

ツールについて不向きなのに、ついHSPで書き始めてしまうのは
HSPの手軽さがすばらしいからだと思う。ただ、速度が遅い。
あらかじめ断っておくと、これは「不向きである」ことに目をつむった上での話です。

たとえば(というか最近思ったこと)こんな要求。
「ファイル転送ツールを書くことにする。
  誤り検知機能を実装するに当たって、データのCRC32を算出したい。」

条件は、とりあえず。
「メモリに格納された64MBのランダムな数列からCRC32を算出する」

んで、いくつか書いてみて、実行時間の比較が以下。

素直にHSP3 : 6分45秒104

#defcfunc crc32 var buf,int len
  crc = $FFFFFFFF
  repeat len
    crc = crc ^ peek(buf,cnt)
    repeat 8
      if crc&1 { crc = crc >> 1 & $7FFFFFFF ^ 0xEDB88320 }
      else { crc = crc >> 1 & $7FFFFFFF }
    loop
  loop 
  return crc ^ $FFFFFFFF

遅いからテーブル : 1分13秒592

#defcfunc crc32 var buf,int len
  dim crctable, 256 ;// 参照用テーブル
  repeat 256 : c = cnt
    repeat 8
      if c&1 { c = c >> 1 & 0x7FFFFFFF ^ 0xEDB88320 
      } else { c = c >> 1 & 0x7FFFFFFF }
    loop
    crctable.cnt = c
  loop

  crc = $FFFFFFFF
  repeat len
    crc = crc >> 8 & $FFFFFF ^ crctable(crc^peek(buf,cnt)&0xff)
  loop 
  return crc ^ $FFFFFFFF

Cで書いてマシン語 : 4秒541

#defcfunc crc32 var data, int len
  xdim func,13
  func.$0 = $33ec8b55,$ffc883d2,$0f084d8b,$33110cb6
  func.$4 = $a8c933c1,$d1097401,$832035e8,$02ebedb8
  func.$8 = $8341e8d1,$eb7208f9,$0c553b42,$f083da72
  func.$C = $00c35dff
  prm = varptr(data),len
  return callfunc(prm,varptr(func),2)

マシン語は http://dream.freespace.jp/perl-bin/puma/lng/joyful.cgi?print+log4/05040003.txt の no.4 からお借りしております。

マシン語のさらにテーブル版 : 0秒191

;//  2/20 9:18修正。
#defcfunc crc32 var data, int len, int crc
  xdim func,25
  func. 0 = $81EC8B55,$000400EC,$6AC93300,$5AC18B08,$097401A8
  func. 5 = $2035E8D1,$EBEDB883,$4AE8D102,$8489EE75,$FFFC008D
  func.10 = $F98141FF,$00000100,$458BD97C,$39C93308,$D0F7104D
  func.15 = $8B56207E,$B60F0C55,$B60F1114,$8BD633F0,$FC009594
  func.20 = $E8C1FFFF,$41C23308,$7C104D3B,$D0F75EE2,$000CC2C9
  prm = crc, varptr(data), len
  return callfunc(prm,varptr(func),3)

 
あらかじめ(でもない)断りを入れさせて貰うと。

まぁ、遅いって言ったって、必要十分の速度が出ればいいことぐらいはわかっているし、
どうしても速度が必要な場合にはこうやってマシン語を組めばいいだけのことなので、
実際は問題にはならないんだけど。
ただ、「遅い」って書いたのはどういう理由かってのを明らかにするために、
やったこととして書いておくだけなので悪しからず。

ゲーム作りでも、もしかしたら、
ビデオメモリのポインタを得て、自分でグリグリしたい。
とか言う要求が出れば、遅すぎて実用不可能なのは確か、だろうなぁ。

# まぁ、HSPユーザの中からそんな要求は出ないので、あろうが……。
# 自分もこれっきりだし。

はい、また「だからなんなの」という記事を書いてしまいましたとさ。