MFCのSerialize,Desirialize part.1 CMap<int,CString>にて
はじめに
誰も使ってないかも知れませんが、 MFCのCMapでのシリアライズ・デシリアライズを試してみました。 まずは単純なintとCStringのMapで、50万の要素で。
環境
環境は、Visual Studio 2013 Community Edition MFC アプリ(ダイアログ)です。
コード
名前付けは適当です(笑
ヘッダーファイル。
#pragma once #include <afxtempl.h> class MapManager { private : CMap <int , int, CString, CString > m_save_Map; CMap <int , int, CString, CString > m_load_Map; public : MapManager(); ~MapManager(); void Initialize(); void Serialize(); void Deserialize(); };
cppファイル。
#include "stdafx.h" #include "MapManager.h" MapManager ::MapManager() { } MapManager ::~MapManager() { } void MapManager ::Initialize() { clock_t start, finish; double duration; start = clock(); m_save_Map.InitHashTable(500009);// 必要な要素数に一番近い素数がパフォーマンスがいいらしい。 for (int i = 0; i < 500000; i++) { CString str; str.Format( _T ("item:%d\r\n" ), i); m_save_Map[i] = str; } finish = clock(); duration = ( double )(finish - start) / CLOCKS_PER_SEC ; TRACE (_T ( "map initialized --- %2.3f seconds\n"), duration); } void MapManager ::Serialize() { clock_t start, finish; double duration; start = clock(); CFile cFileG; if (cFileG.Open(_T ( "SampleFile.txt"), CFile ::modeCreate | CFile:: modeWrite )) { CArchive cArchiveObj(&cFileG, CArchive :: store); m_save_Map.Serialize(cArchiveObj); } finish = clock(); duration = ( double )(finish - start) / CLOCKS_PER_SEC ; TRACE (_T ( "map serialized --- %2.3f seconds\n"), duration); } void MapManager ::Deserialize() { clock_t start, finish; double duration; start = clock(); CFile cFileG; m_load_Map.InitHashTable(500009); if (cFileG.Open(_T ( "SampleFile.txt"), CFile ::modeRead )) { CArchive cArchiveObj(&cFileG, CArchive :: load); m_load_Map.Serialize(cArchiveObj); } finish = clock(); duration = ( double )(finish - start) / CLOCKS_PER_SEC ; TRACE (_T ( "map loaded --- %2.3f seconds\n"), duration); }
呼び出し側のコードはこんな感じ。(MFCのDialogにて呼び出し)
void CCMapSampleDlg ::OnBnClickedOk() { MapManager * map = new MapManager(); map->Initialize(); map->Serialize(); map->Deserialize(); delete map; }
実行結果
速度 - map initialized --- 1.438 seconds - map serialized --- 0.281 seconds - map loaded --- 1.122 seconds SampleFile.txtは、約16MBです。
所感
スピードは悪くないです。
難点は、出力形式が指定できないことですね。 文字コード指定できず・・・CFileだとバイナリなので、意味不明な感じになります。 フォーマットも出来ないので・・・。
Sakuraで開けば一応改行コード入っているので改行はしてくれますが・・・。
ちなみに、CStdioFileだと、saveは出来ましたが(その際はメモ帳で開いても改行されていました)、loadが出来ませんでした。Debug実行時に以下のエラーが出ました。 パラメータの調整が必要なのかも知れません。解析するモチベーションが保てませんでした。 あんまり使えないなぁ。 XML出力という選択肢がある分、Boostのほうがいいと私は思います。