Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哪个更快,XML+;XSL或CLR+;数据绑定_Xml_Data Binding_Xml Serialization_Xslt - Fatal编程技术网

哪个更快,XML+;XSL或CLR+;数据绑定

哪个更快,XML+;XSL或CLR+;数据绑定,xml,data-binding,xml-serialization,xslt,Xml,Data Binding,Xml Serialization,Xslt,XML与XSLT或CLR与数据绑定哪个更快? 我假设它是CLR+数据绑定,但我可能是错的。你应该对你的特定用例进行基准测试,而不是试图根据错误的概括得出一个(可能是错误的)答案。这实际上是一个非常贴近我内心的问题,因为我所做的几乎所有工作都围绕XSLT设计层展开,它有一个自定义的基于.NET的后端来生成数据(我非常喜欢这个系统) 据我所知,有几件事需要记住: 绝对确保使用System.Xml.Xsl.XslCompiledTransform的缓存实例。这个类使用System.Reflectio

XML与XSLT或CLR与数据绑定哪个更快?
我假设它是CLR+数据绑定,但我可能是错的。

你应该对你的特定用例进行基准测试,而不是试图根据错误的概括得出一个(可能是错误的)答案。

这实际上是一个非常贴近我内心的问题,因为我所做的几乎所有工作都围绕XSLT设计层展开,它有一个自定义的基于.NET的后端来生成数据(我非常喜欢这个系统)

据我所知,有几件事需要记住:

  • 绝对确保使用System.Xml.Xsl.XslCompiledTransform的缓存实例。这个类使用System.Reflection.Emit创建随需应变类,这些类将以惊人的速度完成xslt转换

    • 使用正确的数据结构作为xslt转换的输入。如果您有可用的XmlDocument(或者更好的是XPathDocument),请使用它。否则,对于非常大的输入文档和转换,将传入xml读取器(如果可用),因为XslCompiledTransform会将文档加载到XPathDocument(针对XPath访问进行了优化)中。只需补充一点,System.Xml.XPath中存在一个用于System.Xml.Linq.XElement类型的扩展方法,该方法将从XElement创建XPathNavigator,如果源数据结构是XElement,这将非常有用

    • 不要在xsl转换中使用msxsl:script标记。msxsl:script标记的编译方式与xslt的其他部分不同,可能会在高需求应用程序中导致严重的内存泄漏(每次运行xslt时,它们都会加载自定义程序集)

    • 尽量避免使用扩展方法。我将(reflector FTW)分解到.NET源代码,以便在XSLT转换中执行扩展方法,其核心实际上只不过是调用MethodInfo.Invoke()。几个调用不会破坏应用程序,但不要认为可以使用扩展方法弥补XSLT的所有缺点(在未来版本的框架中可能会发生变化,因为它们在自定义哈希系统中缓存扩展方法,所以很可能会将其转换为使用编译的linq表达式,在这种情况下,速度会非常快)

    • 据我所知,System.Web.UI.DataBinder仍然可以归结为System.ComponentModel.ReflectPropertyDescriptor中的一个调用,它使用System.Reflection.MethodInfo.Invoke()来计算Eval(“MyProperty”)这将是两个模型在性能方面最大的比较之一。通过最小化反射调用的数量,XSLT在这方面占了上风

    • 编写未调优的xslt文件非常容易。正确使用xsl变量可以真正消除生成xml输出所需的许多迭代。如果您有一个常用的引用输入元素,请将其存储在xsl变量中,然后从那里访问它

    • 根据您是否计划将xsl输出直接写入响应流。请记住适当调整缓冲区大小。通过在转换内存流上设置默认缓冲区大小,您可以节省大量内存分配(在xsl转换的上下文中,这些分配通常相当大)

    • 虽然这实际上归结为应用程序级的问题。在使用XSLT转换时,您避免了控件创建、视图状态序列化、事件持久化等的全部开销。创建了一个简单得多的页面生命周期(获取数据、转换,中间加上一些细节)with应该为基于XSLT的系统提供另一个优势

总的来说,我的钱肯定花在了一个结构良好、实现得当的XSLT转换上。特别是在一个内存中有大量RAM可用于转换的系统上。我已经看到XSLT转换的规模达到了一个相当令人难以置信的水平,一旦掌握了一些非常关键的要点,维护起来就不难了


我会看看我是否还记得其他人,如果我记得的话,我会编辑这篇文章…

谢谢你问我这个问题,伙计…只是因为我喜欢比较这两个问题…大多数人可能会说它因个案而异…因个案而异…这个问题很模糊,很难知道这个答案到底有多少与此相关,但即使如此,这也是一个很好的信息。