2022/12/24 「内部処理の UTF-16 化」の効果
2022/12/17 a! Reg Analyzer Ver. up to 3.10 and XReg Processor Ver. up to 2.10
2022/12/10 サブクラスにする場合、デストラクターは Virtual のほうが安全
2022/12/03 a! Menu Archiver Ver. up to 2.21 and a! Menu Filer Ver. up to 3.10
今年は公開している全てのソフトに「内部処理の UTF-16 化」をしてきましたが、
その効果を測定したのでお知らせします。
ここ の3番目の変更にも書いてあると通り、
Windows の内部は UTF-16 で処理されていますが、
当ソフトのソースが Shift-JIS コード用でコーディングしてあると、
どうしてもその変換に時間がかかってしまいます。
「内部処理の UTF-16 化」の意味はそれらを全て UTF-16 にしてしまえば
その変換がなくなり実行速度が速くなるのではないかと考えられます。
欠点としては UTF-16 の方がメモリーを食うといったところでしょうか。
そこで比較してみました。
CPUを食う処理として「a! Reg Analyzer」の検索処理を行ってみました。
検索条件は以下の通りです。
検索コンピュータ:sug04、OS:Windows 10 Pro x64
検索範囲:レジストリー全体、64bit View
検索文字列:"abc"
検索対象:キー(全て)、名前(全て)、データ(REG_SZ、REG_EXPAND_SZ、REG_MULTI_SZ)
大文字・小文字は区別しない、「部分文字列も検索」
またメモリー消費量はタスクマネージャーの「メモリ」の最大値を目視で観測しました。
a! Reg Analyzer のバージョン | 検索時間 | メモリー消費量 |
---|---|---|
Ver.3.02(Shift-Jis) | 115秒 | 8.1MB |
Ver.3.10(UTF-16) | 95秒 | 12.4MB |
処理速度が速くなったので意図通りですね。
今日付けで a! Reg Analyzer と XReg Processor をバージョンアップしました。
バージョンアップ内容は以下の通りです。
a! Reg Analyzer Ver.3.10 2022/12/17
2番目の修正は、ここ の2番目の修正と同じです。
3番目の修正は、ここ の3番目の修正と同じです。
4番目の修正は、不具合修正で文字通りです。
5番目の修正は、危険な作業なのであまりやられていないようですが、
キーと名前を同時に変更する場合に不具合が発生します。その修正です。
6番目の修正は、小さい不具合と小さい仕様変更をしよう思ったのですが、
全体と絡んでくるということになって、それならばいっそ全体を見直そうとして修正しました。
7番目と8番目の修正は文字通りです。
XReg Processor Ver.2.10 2022/12/17
2番目の修正は、ここ の2番目の修正と同じです。
3番目の修正は、ここ の3番目の修正と同じです。
以下のソースを見てください。
//--------------------------------------------------------------------------- class CParent //CSub で継承 { public: CParent(void){ Debug("CParent");}; ~CParent(){ Debug("~CParent");}; }; //--------------------------------------------------------------------------- class CChild final : public CParent { public: CChild(void){ Debug("CChild");}; ~CChild(void){ Debug("~CChild");}; }; //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { // // 継承したクラスのデストラクターのテスト Debug("Case1"); CChild* c = new CChild(); delete c; // Debug("Case2"); CParent* p = new CChild(); delete p; // return 0; } //--------------------------------------------------------------------------- |
実行結果は、
Case1 CParent CChild ~CChild ~CParent Case2 CParent CChild ~CParent |
となります。Case2 では「~CChild」が呼び出されません。
こういう場合は親クラスのデストラクターを virtual にします。
//--------------------------------------------------------------------------- class CParent //CSub で継承 { public: CParent(void){ Debug("CParent");}; virtual ~CParent(){ Debug("~CParent");}; }; //--------------------------------------------------------------------------- class CChild final : public CParent { public: CChild(void){ Debug("CChild");}; ~CChild(void){ Debug("~CChild");}; }; //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { // // 継承したクラスのデストラクターのテスト Debug("Case1"); CChild* c = new CChild(); delete c; // Debug("Case2"); CParent* p = new CChild(); delete p; // return 0; } //--------------------------------------------------------------------------- |
Case2 でも「~CChild」が呼び出されました。
見つけにくいバグです。a! Menu Filer Ver.3.10 の
「設定画面のキャンセルでホットキーが効かなくなる不具合の修正」
が起こった原因です。
よって、クラスに final がない場合はデストラクターに virtual をつけることにしました。
他にも同じようなことをしていないかを検証して、全て修正しました。
今日付けで a! Menu Archiver と a! Menu Filer をバージョンアップしました。
バージョンアップ内容は以下の通りです。
a! Menu Archiver Ver.2.21 2022/12/03
2番目の修正は、ここ の3番目の修正と絡んでいて、
a! Menu Archiver と a! Menu Filer でファイル名のやり取りをするのですが、
その部分は、まずは UTF-16 化しないでおかないと既存の a! Menu Filer とでは
ファイル名のやり取りができなくなるので a! Menu Filer との同時公開で両方を直した次第です。
3番目の修正は、文字通りです。
a! Menu Filer Ver.3.10 2022/12/03
2番目の修正は、ここ の2番目の修正と同じです。
3番目の修正は、ここ の3番目の修正と同じです。
4番目から6番目の修正は、不具合修正で文字通りです。
7番目の修正も、ほぼ不具合修正に入り文字通りです。
8番目と9番目の修正は文字通りです。