Scala中XML转换的性能不佳

时间:2015-05-19 16:16:34

标签: xml scala

我正在尝试理解XML转换性能问题:

假设我需要将标签为a的所有元素的标签更改为标签b

val xml = ... // my input XML

val rule = new RewriteRule {
  override def transform(n: Node) = n match {
    case e: Elem if e.label == "a" => e.copy(label = "b")
    case other => other 
  }
}

new RuleTransformer(rule).apply(xml)

不幸的是,当我使用大约30个元素的XML运行代码时,现代笔记本电脑需要> 1 min (!)

例如:

scala> def gen(e: Elem, n: Int): Elem = 
       | if (n > 0) e.copy(child = e.child :+ gen(e, n-1)) else e
gen: (e: scala.xml.Elem, n: Int)scala.xml.Elem

scala> val xml = gen(<a/>, 25)
xml: scala.xml.Elem = <a><a><a><a><a><a><a> ...

scala> val rule = new RewriteRule {
       | override def transform(n : Node) = n match {
       | case e: Elem if e.label == "a" => e.copy(label = "b")
       | case other => other
       | }
       | }
rule: scala.xml.transform.RewriteRule = <function1>

scala> def transform(n: Node): Node = { 
       | val start = System.currentTimeMillis()
       | val r = new RuleTransformer(rule).apply(n)
       | println((System.currentTimeMillis() - start) / 1000)
       | r
       | }
transform: (n: scala.xml.Node)scala.xml.Node

scala> transform(xml)
99

这种表现有意义吗?我错过了什么吗?你会如何修复代码?

0 个答案:

没有答案