ひっそりとmugeneのリリースを続けている。今回ようやくコンパイル速度を実用的なものにしようと思い立って実現した。プロファイルした結果から(というかしなくても)、マクロと変数の探索で時間がかかっていることはよく分かっていたので、そこさえ最適化してしまえば、残りはイマドキのCPUで大した問題にはならないわけだ。
これまではKeyValuePairのListをLINQのFirstOrDefault()でiterateするという、たいへん重いやり方をとっていたのだけど(それはトラック別マクロなどによる上書きを許しつつ検索を可能にするためだった)、処理するトラックごとに適用対象マクロのhash dictionaryを用意して検索することで、圧倒的に高速な処理になった。10倍くらい。ちなみに、.NET FrameworkにはHashtableをgenericにしたものが無いので、C5というジェネリックコレクションライブラリを使っている。
MMLコンパイラは実は10年くらい前にも書いたことがあって、その時もやはりマクロ名からマクロ定義を取得する部分の最適化をいろいろ考えた。当時は文字列のハッシュ検索なんて考えもしなかったので(MS-DOSでのプログラミングだ)、マクロ定義をソートして、A-zまでのインデックスを振って探索していた。ハッシュテーブルが簡単に使える今はずいぶん楽になったと思う。
ともあれ、とりあえずこれで最大の懸案事項が解決したので、あとはいろいろ試しながらチェックを続けようと思う。とりあえず昨日ひとつ、ナチュラルがきちんと処理できていないという問題に気づいた。まだ使っていない命令には、バグがけっこう潜んでいるかもしれない。
Leave a comment