にわかに技術系blogっぽくなってきてる当blogですが。
DirectXとかSeleneとか、要求する文字コードがunicodeつーかwchar_tだったりする事が多々あるんだけど、同時に使ってる別のライブラリがSJISとかMultiByteつーかcharだったりして、でも実際には半角文字しか使わないってことが良くある。
で、char→wchar_tの変換は普通MultiByteToWideChar使うんだけど、半角しか使わないのにMultiByteToWideChar使うのはなんか無駄なんじゃね?
ってことで、試しに作ってみたら速かったので公開。
てか、作ってみたなんて言うほどの内容じゃないけど。
/** 半角限定MultiByteToWideChar param const char *m 変換元文字列ポインタ(末尾�) wchat_t *w 変換後文字列バッファの先頭ポインタ int cchWideChar wのバッファサイズ(バイト数じゃなくて配列数) return 文字数 **/ int fast_char2wchar(const char *m, wchar_t *w, int cchWideChar) { int cnt = 0; for(;cnt < cchWideChar; cnt++) { w[cnt] = m[cnt]; if(m[cnt] == 0)break; } return cnt; }
見ての通り、実装は至ってシンプルです。
一応ベンチマーク。10,000 * 10,000のループで”123456789abcd”を変換。
ビルド:最適化無効
MultiByteToWideChar:8665ms
fast_char2wchar:7350ms
ビルド:最大限の最適化
MultiByteToWideChar:8484ms
fast_char2wchar:1359ms
6倍強速い。
前のfast_atoi/fast_atofもそうだけど、やってることは車輪の再発明なんだよね。標準ライブラリに入ってるんだもの。
だけど、標準のものは安全性とか汎用性とかの為に速度を犠牲にしてるところがあるから、機能や用途を限定すれば高速なモノを自前で作ったりもできる。
開発効率・汎用性・安全性を優先するか、速度を優先するかはケースバイケースですね。
ゲームみたいなリアルタイム系の場合は速度優先だろうから、こーゆー速度優先の関数を再発明(?)ってのもアリなんじゃないかな。
一回作ってしまえば、あとは自分用ライブラリってことで再利用できるしね。