我有一个非常小的函数,但被调用了很多次,我的分析器标记它很耗时。它是以下一个:
private static XmlElement SerializeElement(XmlDocument doc, String nodeName, String nodeValue)
{
XmlElement newElement = doc.CreateElement(nodeName);
newElement.InnerXml = nodeValue;
return newElement;
}
第二行(它进入nodeValue的地方)需要一些时间。
问题是,我不认为它可以在代码方面进行优化,但我仍然对这方面的建议持开放态度。 但是,我记得在某个地方阅读或听到你可以告诉编译器标记这个函数,以便它在程序启动时加载到内存中并且运行得更快。
这只是我的想象力还是存在这样的旗帜?
谢谢,
FB。
答案 0 :(得分:4)
有很多方法可以让你早点进行骑行,但这并不是在这里伤害你的时间。
如果您遇到与Xml序列化相关的性能问题,您可能会考虑使用XmlWriter而不是XmlDocument,这相当重。此外,大多数自动序列化系统(包括内置的.NET XML序列化)将动态发出代码以执行序列化,然后可以对其进行高速缓存和重用。其中大部分都与避免反射的开销有关,而不是实际的XML编写/解析的开销。
答案 1 :(得分:3)
我不认为这可以使用任何类型的捕获或内联来解决。我相信你的想象力。主要是关于性能的部分。您的想法是预先编写代码。首次调用函数时,此技术将消除JITer的等待时间。但这只是第一次调用此函数。它对后续调用没有性能影响。
如documentation所述,设置InnterXml会将字符串解析为XML。解析XML字符串可能是昂贵的操作,特别是如果字符串格式的set xml很复杂。文档甚至还有这一行:
InnerXml不是修改DOM的有效方法。替换复杂节点时可能存在性能问题。构造节点并使用InsertBefore,InsertAfter,AppendChild和RemoveChild等方法修改Xml文档更有效。
因此,如果您以这种方式创建复杂的XML结构,那么手动执行它是明智的。