我正在尝试理解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
这种表现有意义吗?我错过了什么吗?你会如何修复代码?