我有一个asp.net程序,在开发环境运行良好,但在某个客户处性能很差跟踪发现是用xslt解析xml时,花了太长时间。我们开发环境是 winxp pro + iis5.0 + .net 1.1 
客户的运行环境 win2003   + iis6.0 + .net 1.1相同的数据量:xml中大约有4000条记录
开发环境运行时间:40秒
客户环境运行时间:70分种性能相差太大,客户的服务器是双核CPU 内存2G
运行时,w3wp进程,有一个cpu的占用率在90%以上,另一个很低不到10%,占用内存一直不超过128M开发环境运行时,cpu占用100%但并不是所有客户都存在这个问题,只是某一个客户。
有谁遇到过类似情况?我还有一个相同的贴子发在IIS版,如果解决,两贴一起结

解决方案 »

  1.   

    你使用的是哪个技术? XmlDocument ? XPathDocument? 还是MSXML(4.0等)? 
    提高xslt的性能还是有很多方法的,比如可以适当的使用缓存,减少执行创建、解析、销毁的次数;对比一下哪种技术更优, 可供选择的技术和组件还是有一些的;转换格式上减少转换节点,多增加属性等等.
      

  2.   

    TO francsescoli(我爱世界杯) :
    我们用的是XmlDataDocument
    xslTran.Transform(xmlDataDoc, xslArgList, writer);
    我想你的意思是说用XPathDocument会比其它document快些.
    但是我的开发环境与客户环境的程序和数据都是一样的,性能却相差太多。会不会是其它什么原因?
      

  3.   

    我以前就在想这个问题。因为以前曾看见过有人说:xslt+xml让客户端解析。这样减少服务器端的压力。从来没测试过。所以到现在也不知道:(现在二种做法。一种是在xml文件中加入xslt文件
    <?xml-stylesheet type='text/xsl' href='/expert/Xsl/2.xsl'?>这个就是传说中的减少服务器压力?还有一种是通过.NET下的XslTransform来加载解析。这样的解决结果占用了大量的CPU时间。数据量大了就会CPU占用100% .但是这种方法扩展性太好了。什么外部调用。参数传递。楼主自己看着办。随便测试测试第一种方法。然后告诉我性能如何:)
      

  4.   

    嗯,看上去客户机器的配置比你的开发环境好多了,有可能的话,试试.net 2.0 或者别的xPath。我测试一下先。
      

  5.   

    INFO: Performance of XSLT Transformations in the .NET Framework
    http://support.microsoft.com/kb/325689/EN-US/INFO: .NET Framework 中 XSLT 转换之性能 
    http://support.microsoft.com/kb/325689/zh-cn
      

  6.   

    如果你是用.net framework的xml解析器来转换, 铁定要慢死, 因为DOM一次性将4000多的记录LOAD入内存, 可以想像一下占用量, 再加上XSLT的transform..., CPU占用量就有点恐怖了; 而且又不是只一个用户端在访问...
    在.net framework上来做, 很费劲用客户机IE的msxml解析器来转换, 这样会好点
      

  7.   

    谢谢各位的回答
    就像SVG(ben) 说的 DOM一次性将4000多的记录LOAD入内存,铁定要慢死
    而且随着客户的需求增长,我的程序所要处理的xml的规模变得越来越大,有超过60万记录。一个文件要在500M左右。用以前的模式是不可以的。
    所以用以下方式处理:
    我要处理的文件是别的应用程序export出来的,它的格式不是标准的xml,它有两个root,以前数据量小的时候,我都是给文件处面再套一个root,再放进document里。
    现在给一个500M的文件套一个root,花费太大。而且也不能将它放进xmldocument里,不然会报outofmemory.
    现在的处理方式是用XmlReader来读取这个文件,读一部分现(比如100条记录),就把这一部分放到一个小的document里,用xslt处理,再读再处理。但客户的机器为什么会比我们开发环境慢很多的问题还是没搞清,由于各种原因没有办法到客户的机器上去做试验。所以只能给他们一个新的升级包来解决了。