XmlNodeList,我现在才有点明白
2005-10-17 13:47
281 查看
随手写了一个小程序,发现WebClient返回数据特别慢,不知道是网站的原因还是本身的原因。正好同事也在使用,就手工造了近8W多条数据保存到数据库中,然后用Aspx页面读出,WebClient(WinForm)返回后用XmlDocument读取后显示在窗口中的DataGrid中。测试过程中发现,20多分钟还没有显示出界面。本以为是数据量太大造成数据库读取数据和用WebClient返回有问题,但跟踪一下,返回数据不过十秒,而系统停在了XmlDocument中的节点形成DataTable的地方。
由于 程序是测试用,所以就随手写了以下代码
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j < root.ChildNodes[i].ChildNodes.Count; j ++ )
{
;数据转换
}
}
发现竟然这个循环就20多分钟还没有完,10秒钟也就循环500多次
引用有问题?修改
int count = root.ChildNodes[0].ChildNodes.Count ;//数量肯定是一致的
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
XmlNode _node = root.ChildNodes[i] ;
for( int j = 0; j <count; j ++ )
{
;数据转换
}
}
不行,没有用。
把内层循环中的处理去说,保留一个空循环,测试,速度果然提高了不少,10秒钟循环了12000多次。
慢着,怎么会越来越慢?后来连3000次都不到了。难道每次根据节点取索引都从头找吗?
换个思路吧。
int count = root.ChildNodes[0].ChildNodes.Count ;//数据肯定是一致的
XmlNode _node = root.ChildNodes[0] ;
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j <count; j ++ )
{
;数据转换
}
_node = _node.NextSibling ;
}
再测试,FT,竟然5秒都不到就完成了近8W次的数据转换。
哭笑不得啊!
看了一下定义,XmlNode.ChildNodes的类型为XmlChildNodes,不怕,看一下索引实现吧:
果然啊,XmlChildNodes应该是用链表实现的吧?每次根据索引查找一个节点都要从头遍历一次。好弱。
但是当我们用SelectNodes返回的XmlNodeList的类型却是XPathNodeList,内部数据存储是一个ArrayList,这样看起来索引就要快些了。它的索引返回实现如下
说不上是它弱还是我弱,反正歪打正着,要不和真不知道效率是差在这个地方。平时用SelectNodes比较多,也从来没有做过这么大一个XmlDocument。
技术还是要靠钻啊。
由于 程序是测试用,所以就随手写了以下代码
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j < root.ChildNodes[i].ChildNodes.Count; j ++ )
{
;数据转换
}
}
发现竟然这个循环就20多分钟还没有完,10秒钟也就循环500多次
引用有问题?修改
int count = root.ChildNodes[0].ChildNodes.Count ;//数量肯定是一致的
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
XmlNode _node = root.ChildNodes[i] ;
for( int j = 0; j <count; j ++ )
{
;数据转换
}
}
不行,没有用。
把内层循环中的处理去说,保留一个空循环,测试,速度果然提高了不少,10秒钟循环了12000多次。
慢着,怎么会越来越慢?后来连3000次都不到了。难道每次根据节点取索引都从头找吗?
换个思路吧。
int count = root.ChildNodes[0].ChildNodes.Count ;//数据肯定是一致的
XmlNode _node = root.ChildNodes[0] ;
for( int i = 0; i < root.ChildNodes.Count; i ++ )
{
for( int j = 0; j <count; j ++ )
{
;数据转换
}
_node = _node.NextSibling ;
}
再测试,FT,竟然5秒都不到就完成了近8W次的数据转换。
哭笑不得啊!
看了一下定义,XmlNode.ChildNodes的类型为XmlChildNodes,不怕,看一下索引实现吧:
public override XmlNode Item(int i) { if (i >= 0) { XmlNode node1 = this.container.FirstChild; while (node1 != null) { if (i == 0) { return node1; } node1 = node1.NextSibling; i--; } } return null; } |
但是当我们用SelectNodes返回的XmlNodeList的类型却是XPathNodeList,内部数据存储是一个ArrayList,这样看起来索引就要快些了。它的索引返回实现如下
public override XmlNode Item(int index) { if (index >= this.list.Count) { this.ReadUntil(index); } if ((index < this.list.Count) && (index >= 0)) { return (XmlNode) this.list[index]; } return null; } private ArrayList list; |
技术还是要靠钻啊。
相关文章推荐
- spark的时候用到了ant,现在才有点明白ant是干啥滴~
- C#操作Xml的两种方式 XPath XmlDocument XmlNodeList
- 这两天整理springmvc+jpa+vaadin整理好了。现在吧pom.xml和一些配置文件发出来。
- 总算有点明白0x01是十六进制 转换成正数应该为1
- 自己私藏的一篇:和现在做网络营销、咨询公司业务有关 和技术无关 和CRM有点关系 可能给网络社区和网络营销从业者有启发
- XML现在已经成为一种通用
- 学习Opencv中文版--例2--10,书上的代码有点问题,现在把遇到的问题及解决方案作总结
- XMLDOMNodeList length #text
- XML现在的作用是什么
- 【科普】:10分钟看明白XML和JSON
- 收藏一个有趣的帖子,现在的客户端真有点让人不安,难怪XSS。。。
- xmlns + SelectNodes = empty XmlNodeList
- 现在在学习html 感觉单词好多 有点晕了
- 我现在是一点也看不明白。。只知道写出那些代码就会出现那种结果 你开始学的时候看的明白吗 不明白原因。 主要学C吗
- 现在明白为什么要“男左女右”了...
- 今天思路有点乱,随便记一点关于 xml-rpc 的
- 好像开始有点明白主动路由和被动路由的概念了
- 今天打到sxm一段,有点井漏,从上午10点半到现在一直在堵漏
- XML中XDOMNODELIST个数读取个数不正确
- 一年前自己写的东西现在看来怎么有点陌生。。。