XML 定时
测试使用 XML 文档或简单结构体数组进行搜索的时间。
引言
在设计应用程序时,团队决定使用 XML 存储和读取启动应用程序所需的配置数据。 同时也决定使用同一个文档存储运行时数据。 由于 XML 文档已经加载到内存中,并且应用程序还需要存储在其中的数据来查找和插入新元素,这似乎是一个不错的选择。 然后有人提出了一个问题:“速度如何?” XML 方法在查找时间上是否比使用简单结构体数组有任何优势?
我不记得见过任何数据或应用程序可以回答这个问题,所以我编写了一个快速的应用程序来执行一些计时测试并获取数据来回答这个问题,至少在我们的特定情况下是这样。 它可能不适用于所有项目,但它可能会为其他有类似问题的人提供答案。
示例代码中包含的 config_data.xml 文件是在加载配置文档并插入运行时信息后生成的。 我从这个文件中读取标签元素,并填充了一个具有类似结构的结构体数组。
<tag id="1" name="Cmd" datatype="INT" type="CMD" bit="-1" client_id="3" server_id="15067272" value="0"/> typedef struct tagTESTDATA { int nID; TCHAR szName[10]; short sDataType; ALARM_TYPES eType; short sBit; long lClient; long lServer; TCHAR szValue[4]; } TESTDATA;
对话框中的两个列表框填充了用于执行查找的 ID。 为了不只是选择随机 ID,我允许用户选择,这样测试就不会出现偏差,并且可以测试数组位置的多种组合。 XML 的计时使用带有 XPath 语法的 selectSingleNode
。 而数组使用 for
循环来评估数组中的每个结构体,直到找到匹配项为止。
CComPtr<IXMLDOMNode> pNode = NULL; if( SUCCEEDED(m_pDoc->selectSingleNode(strParam.AllocSysString(), &pNode)) && pNode) for(long x = 0; x < m_nCount; x++ ) { if( m_data[x].lClient == lVal ) break; }
每个测试执行 5 次,并返回平均值。
警告: 此应用程序需要 MSXML 4.0。