我正在尝试通过大小为4 MB的xml文件上的C程序运行一些XPath查询。我也在计算吞吐量(xml文件的大小除以解析xml文件所花费的时间和运行查询所花费的时间)但有一件事让我很困惑。当我运行以下XPath表达式时:
“//什么| // //是说,”
..我的吞吐量大约为700兆比特/秒。但是当我接下来运行以下表达式时:
“什么| // //是说,”
......我的吞吐量约为36兆比特/秒。任何人都可以向我解释为什么在第二个查询开始时删除两个双斜线会导致吞吐量显着下降?我真的很感激任何帮助。
答案 0 :(得分:0)
将//
添加到XPath意味着“从根目录开始,检查文档中的所有节点是否存在以下情况。”如果删除它,它只期望检查当前节点。
示例:
<root>
<A>
</A>
<D position="I'm here">
<B>I'm inside D!</B>
<C>So am I!</C>
</D>
<B>I'm not inside D.</B>
<C>I'm not either.</C>
</root>
如果我在这里应用XPath //C
,我的结果将是
<C>So am I!</C>
<C>I'm not either.</C>
但如果我应用XPath C
,我的结果只是<C>So am I!</C>
因此,即使您获得相同的结果,也可以通过应用//
来搜索整个文档。
通过使用what|//is//that
,如果XPath没有找到具有该名称的当前节点的子节点,它将停止搜索。使用//what|//is//that
,您需要查找所有is
,that
和what
个节点,这需要更长的时间。
如果您担心效率问题,请尽可能精确地使用路径(例如root/A/D/C
代替//C
)