classはやはり遅かった

将棋ソフト開発の話題ですが、
局面をあらわすものや、手などをclassで定義していましたが、
それをstruct、すなわち構造体に書き換えてみました。


YSSの解説で、仮にclassを使ったとしても、VC++レジスタを使うので遅くなるのは数パーセントだったという記述があったので、
そんなに効果が無いかなと思ってましたが、
別にclassといっても全部publicだし、メソッドも定義してないので意味無かったし。
でも、改良を考えたらclassがいいみたいに、うさぴょんの解説に書いてあったし。
でも、継承使うぐらいなら、書き換えでしょう?
速さが命の思考アルゴリズムなんだし。
てな感じで、classを全廃してみた。


C:\shogidev>shogi
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load
7776
4)▲3334歩(1) △8786歩(1) ▲2288馬(1) △2888飛(1)
5)▲1314歩(-1) △1918香(-1) ▲2213角(-1) △8844角(-1)
最善手)▲1314歩(2) △2726歩(2) ▲3334歩(2) △8822馬(2)
cputime=13.922000sec
search=3574200 cut=175535 leaf=3235434 hash=138040 score=2
駒得=0 広さ=4 占領=0 固さ=0
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load

3574200node/13.92sec = 256Knode/sec


classをtypedef structで定義して、コンパイルしなおして、
再実行。


C:\shogidev>ccs
C:\shogidev>bcc32 -O2 -Oi -OS -Ov -vi -6 shogi.cpp shogi2.cpp
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
shogi.cpp:
shogi2.cpp:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
C:\shogidev>shogi
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load
7776
4)▲3334歩(1) △8786歩(1) ▲2288馬(1) △2888飛(1)
5)▲1314歩(-61) △1918杏(-61) ▲3334歩(-61) △8822馬(-61)
最善手)▲1314歩(261) △8786歩(261) ▲3334歩(261) △2838龍(261)
cputime=6.781000sec
search=3347904 cut=168269 leaf=3096549 hash=57766 score=261
駒得=0 広さ=4 占領=0 固さ=0
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load

3347904node/6.7810000sec = 493Knode/sec

うげー。二倍も早くなってるよ(^^;;;;
VC++なら変わらないらしい?が、bccでは大違いらしい。
classなんか使うもんじゃないな。
しかし、探索結果が違うのが謎だ‥‥
ロジックに変わりは無いはずだが?


駒得と大駒の移動可能数を評価関数にしてたのを、
差分計算してる駒得のみにしてみた。


C:\shogidev>shogi
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load
7776
4)▲3334歩(0) △7675歩(0) ▲2288馬(0) △2888飛(0)
5)▲1314歩(-60) △1918杏(-60) ▲1112香(-60) △7675歩(-60)
6)▲6364歩(215) △8877角(215) ▲8242飛(215) △7675歩(215)
最善手)▲6364歩(0) △8877角(0) ▲8262飛(0) △5756歩(0)
cputime=20.360000sec
search=16836534 cut=982048 leaf=15268926 hash=453776 score=0
駒得=0 広さ=4 占領=0 固さ=0
01歩 02香 03桂 04銀 05金 06角 07飛
aa:debug bb:back b1:save b2:load

さらに早くなって(当たり前だけど)
826Knode/sec
1秒間に82万局面探索ってのはけっこういいかも。
CPUがceleron 1.7GHzだから、AMD64 x2 4.2GHzとかにしたら
どのくらいになるのかなあ。

しかし、1918杏っていったい? 成りのロジックが誤動作か? unsinged関係のバグかな?