我正在编写一个自己的类来解析一些xml文档。因此我使用libxml。我创建了一个XMLDocument类和一个XMLNode类。我写了一些像“elementsForName”等函数。最后,当我解析大量的xml文档时,在iPad 3上运行的整个项目非常慢。我试图找出问题所在的'仪器'的'Time Profiler'。
问题在于Swift如何与Arrays一起使用。我有一个名为func elementsForName(name: String) -> [MyXMLNode]? {
的函数。在这个方法中,我循环遍历给定节点的所有子节点。我比较节点类型和节点名称。如果它与'name'-String相同,我创建一个MyXMLNode类的新实例并将其附加到数组中。问题是,附加到数组会调整数组的大小,因此Swift将复制整个数组。这最终需要很多时间。 (我找到了这个有用的帖子:Swift vs Java - speed at filling big array)
这是我的方法:
func elementsForName(name: String) -> [MyXMLNode]? {
var children = [MyXMLNode]()
var currentNode = nodePointer!.memory.children
while currentNode != nil {
let tag = String.fromCString(CString(UnsafePointer<xmlChar>(currentNode.memory.name)))
if currentNode.memory.type.value == 1 && tag == name {
children.append(MyXMLNode(xmlNodePointer: currentNode))
}
currentNode = currentNode.memory.next
}
if children.count == 0 {
return nil
}
return children
}
我考虑过创建一个具有给定容量的数组,但在结束循环之前,我不知道,将找到给定名称的多少元素。
有什么想法吗?
答案 0 :(得分:0)
您可以使用Array.append()
和Array.filter()
等其他现有的Swift Array方法来阻止使用Array.map()
。类似的东西:
nodes.filter {
let tag = ...
return $0.memory.type.value == 1 && tag == name
}.map { (cn:Node) in MyXMLNode(xmlNodePointer: cn) }}