2011-03-12 4 views
14

다른 시나리오에서 XPath와 DOM 간의 포괄적 인 성능 비교를 나에게 알려 줄 수 있습니까? 나는 xPath vs DOM API, which one has a better performanceXPath or querySelector?처럼 몇 가지 질문을 읽었습니다. 그들 중 누구도 특정 사례를 언급하지 않았습니다. 여기 내가 시작할 수있는 일이 있습니다.XPath 대 DOM의 성능

  1. 반복 작업이 필요하지 않습니다. getElementById (foobar) vs // * [@ id = 'foobar']. 전자는 후자보다 끊임없이 빠릅니까? 후자가 최적화되면 어떻게됩니까?/html/body/div [@ id = 'foo']/div [@ id = 'foobar']?
  2. 반복이 필요합니다. getElementByX는 자식 노드를 통과하고 XPath는 스냅 샷을 생성 한 다음 스냅 샷 항목을 통과합니다.
  3. 축이 관련되어 있습니다. getElementByX는 다음 형제 자매 vs // following-sibling :: foobar를 트래버스합니다.
  4. 다른 구현입니다. 다른 브라우저와 라이브러리는 XPath와 DOM을 다르게 구현합니다. 어떤 브라우저의 XPath 구현이 더 좋습니까? xPath vs DOM API, which one has a better performance에서 응답이 말하듯 XPath를 최적화 보장하면서 DOM 방식으로 복잡한 작업 (예를 들면, 여러 관련 축)을 구현할 때

평균 프로그래머 망칠 수있다. 따라서 제 질문은 두 가지 방법으로 모두 수행 할 수있는 간단한 선택에만 관심이 있습니다.

모든 의견을 주셔서 감사합니다.

+0

성능 및 최적화와 관련하여 거의 모든 질문과 마찬가지로 구체적인 상황과 내용에 따라 다릅니다. 대답은 "데이터로 앱 프로필을 작성하고 가장 적합한 방법을 선택하십시오"입니다. 또한 너무 많은 일반적인 질문을했습니다. 이 질문은 아마도 "진짜 질문이 아닙니다"로 끝나야합니다. 다른 사람이 그렇게 생각하면 투표에 참여하여 그렇게 할 것입니다. –

+0

개인적으로 DOM은 일반적으로 XPath 또는 선택기 API 구현 (예 : Firefox)보다 10 배 이상 빠릅니다.그러나 XPath는 컨텍스트 노드를 허용하기 때문에 DOM이있는 "안정된"부모 노드를 선택하고 나머지 작업에는 XPath를 사용하는 것이 가장 좋습니다. 이것은 고성능과 견고성이 모두 있습니다. –

+0

XPath는 비 DOM API에서 빌드 될 수 있습니다. 예를 들어, vtd-xml의 xpath 구현은 가상 토큰 설명자 위에 구축됩니다. –

답변

22

XPath와 DOM은 모두 구현이 아닌 사양입니다. 특정 구현에 대해서만 사양의 성능에 대해 질문 할 수는 없습니다. 빠른 XPath 엔진과 느린 XPath 엔진 사이에는 적어도 10 대 1의 차이점이 있습니다. 어떤 이들은 쿼리가 여러 번 실행될 것이라는 가정하에 쿼리를 최적화하는 데 많은 시간을 소비합니다. 이는 단일 샷 실행에 대해 잘못된 작업 일 수 있습니다. 말하자면 XPath의 성능은 사용하는 엔진에 따라 다르며 DOM의 성능은 응용 프로그램 프로그래머의 능력에 더 의존합니다. 이는 하위 인터페이스이기 때문입니다. 물론 모든 프로그래머는 자신이 평균보다 훨씬 좋다고 생각합니다.

+0

+1 XPath 엔진 간의 차이점을 믹스에 추가합니다. –

+0

Firefox, Chrome, IE, Opera 등 가장 일반적인 구현 방법은 어떻습니까? 나는 그들이 엔진을 상당히 균형 잡힌 방식으로 최적화한다고 가정한다. 그러한 가정하에 질문에 대한 답이 있습니까? –

+0

나를 "훨씬 더 나은 다음 평균"전화 해 주셔서 고마워요 :) –

2

구현에 따라 다를 수 있다고 Michael에 동의하지만 일반적으로 DOM이 빠릅니다. 이유는 XPath를보다 빠르게 만들기 위해 구문 분석 된 문서를 최적화 할 수있는 방법이 없기 때문입니다.

XML이 아닌 HTML을 탐색하는 경우 특수 파서는 문서의 모든 ID와 클래스를 색인화 할 수 있습니다. 이렇게하면 getElementById 및 getElementsByClass가 훨씬 빠르게 수행됩니다.

XPath를 사용하면 위에서 아래로 또는 아래로 위로 이동하여 해당 ID의 요소를 찾을 수있는 유일한 방법이 있습니다. 반복 쿼리 (또는 부분 쿼리)를 메모 할 수는 있지만 수행 할 수있는 다른 최적화는 표시되지 않습니다.

3

이 페이지에는 두 가지를 비교하고 여러 브라우저에서 결과를 확인하는 테스트를 실행할 수있는 섹션이 있습니다. 예를 들어 Chrome의 경우 xpath는 getElementById보다 100 % 느립니다.

자세한 내용은 getElementById vs QuerySelector을 참조하십시오.

+0

안녕하세요 Claudiu, 오신 것을 환영합니다 StackOverflow! 게시 한 링크가 도움이 될 수 있지만 StackOverflow의 목표는이 페이지를 방문한 다른 사용자가 귀하의 답변으로 도움이 될 수 있도록 앞으로 몇 년간 지식 저장소가되는 것입니다. 링크가 끊어지면 답은 쓸모 없게됩니다. 링크의 예가 포함되도록 답을 편집하십시오. 그러면 링크가 사라지면 답안에 가치가 생깁니다. 행운을 빌어 요, StackOverflow에 오신 것을 환영합니다! :) – jmort253

+0

나는 앞으로 나아가고 약간의 개선을했다. 행운을 빕니다! – jmort253