RapidXml原理和使用

在项目进行到快收尾时,我们伟大的测试小组提出我们现有的联系人保存时间太长,从1000条联系人中删除三条联系人需要15s左右,并且要求新的保存方案在5s内。

5s?我希望可以在2s内保存。

所以google了下tinyxml如果提高效率,很幸运地发现rapidxml。从rapidxml的官方网站下载了其源代码,并测试了下效率,发现其比tinyxml确实要快很多,在我现有机器上大约要快3倍。欣喜之余,便研究其源代码来。

rapidxml快速有以下原因:

1)使用memory pool分配及释放内存。rapidxml默认每次申请64K的空间,如果当前pool中的空间不足,则会以64K空间的大小逐步增加。试想,连续申请16000次每次申请4个字节,和申请一次64K,之间谁的时间短?当然是一次时间短。

2)避免多余的字符串拷贝。无疑,字符串拷贝是非常耗时的,rapidxml为了追求rapid的特点,在内部拷贝时都只使用浅拷贝(与深拷贝相对:只是拷贝指针的值,而不是拷贝指针指向的内容)。不过也由此,使用者在保存xml文件时,需要注意一点:当将rapid写入到内存之前,应保存浅拷贝时指针指向的内容没有发生改变。否则,你会发现保存的文件内容都是错误的值。

基于以上两点,rapidxml非常快速,无论是读取还是保存。

将其用在我们工程问题中,确实大大提升了效率,目前我们1000条联系人保存时间只需要2s保存。

后续工作中,我将rapidxml封装了一下,不过由于其浅拷贝的机制,不能达到向tinyxml那般顺手。不过,它很强大,不是吗?

附上读取和保存的部分代码.

[html] view plain copy print ?
  1. // Load file to buffer.  
  2. rapid::xml_file<> fileLoad("test.xml");  
  3. char* content = fileLoad.data();  
  4. if (content) {  
  5.     // Load content to rapid.  
  6.     rapid::xml_document<> docParse;  
  7.     docParse.parse<0>(content);  
  8.   
  9.     // Parse node.  
  10.     rapid::xml_node<>node_root = docParse.first_node("item");  
  11.     ...   
  12. }  
// Load file to buffer.
rapid::xml_file<> fileLoad("test.xml");
char* content = fileLoad.data();
if (content) {
    // Load content to rapid.
    rapid::xml_document<> docParse;
    docParse.parse<0>(content);

    // Parse node.
    rapid::xml_node<>* node_root = docParse.first_node("item");
    ... 
}

[cpp] view plain copy print ?
  1. rapid::xml_docmenet<> docSave;  
  2.   
  3. // Generate root node.   
  4. rapid::xml_node<>* node_root = docSave.alloc_node(docSave.allocate_string("item"));  
  5. ...  
  6.   
  7. // Save to file.   
  8. std::ofstream fileSave;  
  9. fileSave << docSave;  
rapid::xml_docmenet<> docSave;

// Generate root node.
rapid::xml_node<>* node_root = docSave.alloc_node(docSave.allocate_string("item"));
...

// Save to file.
std::ofstream fileSave;
fileSave << docSave;

你可能感兴趣的:(vc程序设计)