XML 与 XSLT 或 CLR 与 DataBinding 哪个更快? 我假设它是 CLR + 数据绑定(bind),但我可能错了。
最佳答案
这实际上是一个非常贴近我内心的问题,因为我所做的几乎所有工作都围绕 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 时都会加载自定义程序集)
尽可能避免使用扩展方法。我反汇编(反射器 FTW)一直到 .NET 源代码,以便在 XSLT 转换中执行扩展方法,从本质上讲,它实际上只不过是对 MethodInfo.Invoke() 的调用。一些调用不会破坏您的应用程序,但不要认为您可以使用扩展方法来弥补 XSLT 的所有缺点(可能会在框架的 future 版本中发生变化,因为它们在自定义哈希系统中缓存扩展方法,他们很有可能将其翻译为使用编译的 linq 表达式,在这种情况下,速度会快如闪电)
据我所知,System.Web.UI.DataBinder 仍然归结为 System.ComponentModel.ReflectPropertyDescriptor 中的一个调用,它使用 System.Reflection.MethodInfo.Invoke() 来评估 Eval("我的属性(property)”)声明。这将是两种模型之间性能方面最大的比较之一。通过最小化反射调用的数量,XSLT 在这方面占据了上风。
编写未经调整的 xslt 文件非常非常容易。正确使用 xsl 变量可以真正消除生成 xml 输出所需的许多迭代。如果您有一个经常引用的输入元素,请将它存储在一个 xsl 变量中,然后从那里访问它。
取决于您是否计划将 xsl 输出直接写入响应流。请记住正确调整缓冲区大小。通过在转换 MemoryStream 上设置默认缓冲区大小,您可以节省大量内存分配(在 xsl 转换的上下文中通常相当大)。
虽然这实际上归结为应用程序级别的问题。在使用 XSLT 转换时,您可以避免控件创建、 View 状态序列化、事件持久化等的全部开销...创建一个更简单的页面生命周期(获取数据、转换,中间有一些细节)应该给另一个边缘到基于 XSLT 的系统。
总的来说,我的钱肯定花在了正确实现 XSLT 转换的良好结构上。特别是在具有大量 RAM 可用于内存转换的系统上。我已经看到 XSLT 转换扩展到一个相当令人难以置信的水平,一旦掌握了一些非常关键的点,维护起来就真的不难了。
我会看看我是否还记得其他人,如果我记得,我会编辑这篇文章...
关于xml - 哪个更快,XML + XSL 或 CLR + DataBinding,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1886793/
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“
eruby和erb有什么区别?哪些考虑因素会促使我选择其中之一?我的应用程序正在为网络设备(路由器、负载平衡器、防火墙等)生成配置文件。我的计划是对配置文件进行模板化,在源文件中使用嵌入式ruby(通过eruby或erb)来执行诸如迭代生成路由器的所有接口(interface)配置block之类的操作(这些block都非常相似,仅在标签上有所不同和IP地址)。例如,我可能有这样一个配置模板文件:hostnamesample-routerlogging10.5.16.26当通过嵌入式ruby解释器(erb或eruby)运行时,会产生以下输出:hostnamesample-rout
原始问题Letd(n)bedefinedasthesumofproperdivisorsofn(numberslessthannwhichdivideevenlyinton).Ifd(a)=bandd(b)=a,whereab,thenaandbareanamicablepairandeachofaandbarecalledamicablenumbers.Forexample,theproperdivisorsof220are1,2,4,5,10,11,20,22,44,55and110;therefored(220)=284.Theproperdivisorsof284are1,2,
有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=
出于某种原因,heroku尝试要求dm-sqlite-adapter,即使它应该在这里使用Postgres。请注意,这发生在我打开任何URL时-而不是在gitpush本身期间。我构建了一个默认的Facebook应用程序。gem文件:source:gemcuttergem"foreman"gem"sinatra"gem"mogli"gem"json"gem"httparty"gem"thin"gem"data_mapper"gem"heroku"group:productiondogem"pg"gem"dm-postgres-adapter"endgroup:development,:t