일부 XML 문서를 구문 분석하기 위해 고유 한 클래스를 작성하고 있습니다. 따라서 libxml을 사용합니다. XMLDocument 클래스와 XMLNode 클래스를 만들었습니다. "elementsForName"과 같은 함수를 작성했습니다. 결국 iPad 3에서 실행되는 전체 프로젝트는 거대한 xml 문서를 구문 분석 할 때 매우 느립니다. 나는 문제가있는 'Instruments'의 'Time Profiler'로 알아 내려고 노력했다.Swift가 Array.append를 사용하지 못하도록 막습니다.
문제는 방법, 스위프트가 배열과 함께 작동하는 방식입니다. 나는 func elementsForName(name: String) -> [MyXMLNode]? {
이라는 함수를 가지고있다. 이 방법에서는 주어진 노드의 모든 자식 노드를 반복합니다. 노드 유형과 노드 이름을 비교합니다. 'name'-String과 같으면 MyXMLNode 클래스의 새 인스턴스를 만들어 배열에 추가합니다. 문제는 배열에 추가하면 배열의 크기가 조정되므로 Swift가 전체 배열을 복사한다는 것입니다. 결국 많은 시간이 필요합니다. 여기
내 방법 :
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
}
내가 주어진 용량 배열을 만드는 방법에 대해 생각했지만, 루프를 종료하기 전에, 나는 알 수는 얼마나 많은 요소 (Swift vs Java - speed at filling big array 나는이 유용한 스레드를 발견) 주어진 이름이 발견 될 것이다.
아이디어가 있으십니까?
왜 연결 목록 데이터 구조를 사용하지 않습니까? 간단하고 강력하며 정확히 필요한 것. – AndrewShmig
링크 된 목록은 요소를 삽입 할 때 속도가 정확히 알려지지 않았습니다 ... – Atomix
@JoJoe, 연결된 요소의 끝에 새 요소를 삽입하는 것은 O (1)입니다. 뭐가 문제 야? – AndrewShmig