使用rapidxml读取xml文件的最快方法 我在C++中用RAPDIDXML读取大量的XML文件,并试图优化阅读,因为这个部分大部分时间都在消耗(我用 STD::SCORO )测量了。

使用rapidxml读取xml文件的最快方法 我在C++中用RAPDIDXML读取大量的XML文件,并试图优化阅读,因为这个部分大部分时间都在消耗(我用 STD::SCORO )测量了。,c++,xml,optimization,rapidxml,C++,Xml,Optimization,Rapidxml,也就是说,我有一个大约40 MB的XML文件-从rapidxml进行实际解析只需要大约2300毫秒(这是绝对好的)。但是将文件从mystd::ifstream复制到缓冲区大约需要30000毫秒。我想知道瓶颈是我的硬盘速度,还是我可以做些什么来保存缓冲区拷贝 std::ifstream file(filename); if(file == nullptr){ throw std::runtime_error("File "+filename+" not found!"); } rapidxml

也就是说,我有一个大约40 MB的XML文件-从rapidxml进行实际解析只需要大约2300毫秒(这是绝对好的)。但是将文件从my
std::ifstream
复制到缓冲区大约需要30000毫秒。我想知道瓶颈是我的硬盘速度,还是我可以做些什么来保存缓冲区拷贝

std::ifstream file(filename);
if(file == nullptr){
  throw std::runtime_error("File "+filename+" not found!");
}
rapidxml::xml_document<> doc;
std::vector<char> buffer((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>( ));
buffer.push_back('\0');
doc.parse<0>(&buffer[0]); 
rapidxml::xml_node<>* root = doc.first_node();
std::ifstream文件(文件名);
if(file==nullptr){
抛出std::runtime_错误(“文件”+文件名+“未找到!”);
}
rapidxml::xml_文档文档;
std::vector buffer((std::istreambuf_迭代器(文件)),std::istreambuf_迭代器());
buffer.push_back('\0');
文档解析(&buffer[0]);
rapidxml::xml_node*root=doc.first_node();
问题是行:
std::vector buffer((std::istreambuf_迭代器(文件)),std::istreambuf_迭代器())在40MB文件上大约需要30秒


您知道如何优化此处的阅读吗?

第一次,您是否尝试过使用较低级别的API?具体地说,我会想到以1MB的增量从
文件
读取,因为这很可能是
istream
在幕后使用的,因此应该为您提供一个合理的性能下限。如果与
istream
的区别很大,那么我们可以开始研究它(例如用更大的版本替换其内部缓冲区)。第二个想法可能是使用rapidxml_utils.h中定义的rapidxml::file类。这会影响性能吗?@MatthieuM。在我的平台上,unistd.h不可用(Windows 7,VS 2012),但我可以尝试使用fopen()/fread()读取该文件。我会详细说明,如果有一个替代性能增益与它。@Shelling哦,非常好的一点-我不知道这类!如果我使用构造函数
文件(const char*filename)
读取只需约4000毫秒-这是一个巨大的性能提升(如果我使用此构造函数,会弹出一个编译器警告-
rapidxml\u utils.hpp(40):警告C4244:初始化:从std::streamoff转换为size\t,可能会丢失数据
)。如果我从多线程并行(不同的文件)调用此构造函数,则存在访问冲突。构造函数
文件(std::basic_istream&stream)
的性能几乎与我自己的解决方案(30秒)一样。@Shelling:您可能想尝试一下,作为答案的雏形,并借此机会说明如何“正确地”调用这些方法。