2014-07-20 6 views
0

일부 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 나는이 유용한 스레드를 발견) 주어진 이름이 발견 될 것이다.

아이디어가 있으십니까?

+1

왜 연결 목록 데이터 구조를 사용하지 않습니까? 간단하고 강력하며 정확히 필요한 것. – AndrewShmig

+0

링크 된 목록은 요소를 삽입 할 때 속도가 정확히 알려지지 않았습니다 ... – Atomix

+0

@JoJoe, 연결된 요소의 끝에 새 요소를 삽입하는 것은 O (1)입니다. 뭐가 문제 야? – AndrewShmig

답변

0

Array.filter()Array.map()과 같은 다른 기존 스위프트 배열 방법을 사용하면 Array.append()을 사용할 수 없습니다. 뭔가가 :

nodes.filter { 
    let tag = ... 
    return $0.memory.type.value == 1 && tag == name 
    }.map { (cn:Node) in MyXMLNode(xmlNodePointer: cn) }} 
+0

이것은 대답이 없습니다 ... –

+0

우리는 보지 않을 것입니다! – GoZoner

+0

답해 주셔서 감사합니다. filter()와 map()에 대한 내용을 이해하지 못했습니다. (예를 들어 읽을 것입니다.) 예제에서 'Node'는 무엇입니까? – Lupurus

관련 문제