Xml_E で,MFC を使用しない様に変更中.
XML のデータを用意して,以下の様に単純に 100 個の配列にコピーする時間を計測しようとした.
   ElapseTick	et ;
   CArray	xmlAry ;                   //	std::vector	xmlAry ;
   for (int index=0 ; index<100 ; index++) {
     xmlAry.Add(Xml_Data) ;           //		xmlAry.push_back(Xml_Data) ;
     }
   CString	etStr = ::ToString(et.GetElapse()/1000.0) ;
   m_CtrlResult.SetWindowText(etStr) ;
データによっては期待した結果(MFC 版と同等またはそれより高速)が出たが,
この SVG を使用してメモリが少ない環境では極端に遅くなってしまった.
そこで,それぞれのサイズを調べてみた.
| VC 6 | VC 7 | VC 8 | VC 9 | VC 10 | VC 8 Debug | VC 9 Debug | VC 10 Debug | VC 8 x64 | VC 9 x64 | VC 10 x64 | VC 9 x64 Debug | VC10 x64 Debug | Xcode 64 Debug | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| CString | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 4 | 8 | 8 | 8 | 8 | 8 | |
| CArray | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 20 | 40 | 40 | 40 | 40 | 40 | |
| tstring | 16 | 28 | 28 | 28 | 28 | 32 | 32 | 32 | 40 | 40 | 40 | 48 | 48 | 8 | 
| vector | 16 | 16 | 16 | 24 | 16 | 20 | 20 | 20 | 32 | 48 | 32 | 40 | 40 | 24 | 
| Xml_E | 68 | 92 | 92 | 108 | 92 | 108 | 108 | 108 | 152 | 184 | 152 | 184 | 184 | 72 | 
tstring は,std::string または std::wstring .
vector は, <int> のサイズ.sizeof (std::vector<bool>) は vector<int> などより大きくなることがあるみたい.
Xml_E の MFC 版のデータメンバは,
CString Name , CString Text , CArray<Xml_Attribute,Xml_Attribute> Attribute , CArray<Xml_E,Xml_E> Child .
STL 版は tstring と std::vector に置換えた.
| MFC Xml_Attribute | 12 | 4 + 4*2 | 
| MFC Xml_E | 52 | 4 + 4*2 + 20*2 | 
| STL Xml_Attribute | 36 | 4 + 16*2 | 
| STL Xml_E | 68 | 4 + 16*2 + 16*2 | 
2013/04/22
SVG の全要素数は 5,557 ,属性は 19,103 .MFC 版では 518,200 ,STL 版では 1,065,584 となる.
つまり 50 M ~ 100 M 位が一時的に必要となってしまっていた(200 個にした時もあり).
ループ部分を 2 重ループとして,内側を 10 で 10 個の配列が必要となる様に改良.
時間を計測すると環境にもよるがほぼ同等の結果が得られた,
T5400 では MFC 6 秒と STL 3 秒.