2013-07-27 4 views
-2

내가 필요로하는 것이 무엇보다 명확한 것입니다.XSLT에서 불필요한 변수 사용은 얼마나 비쌉니까?

에 관해서는 this answer으로, XSLT 변수는 저렴합니다! 내 질문입니다 :이 진술은 모든 시나리오에 유효합니까? 생성되고 얻을 4 라인 코드와 함께 파괴 얻을 인스턴트 변수는 내 생각에 실제로 나쁜 연습입니다 루트 노드 또는 하위 엔티티를로드, 성가신되지 않습니다 ..

나는 두 개의 XSLT 파일, 동일한 입력 및 출력 요구 사항 :

XSLT1 (불필요한 변수없이) :

<?xml version="1.0" encoding="UTF-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
     <Collection> 
      <xsl:for-each select="CATALOG/CD"> 
       <DVD> 
        <Cover> 
         <xsl:value-of select="string(TITLE)"/> 
        </Cover> 
        <Author> 
         <xsl:value-of select="string(ARTIST)"/> 
        </Author> 
        <BelongsTo> 
         <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/> 
        </BelongsTo> 
        <SponsoredBy> 
         <xsl:value-of select="string(COMPANY)"/> 
        </SponsoredBy> 
        <Price> 
         <xsl:value-of select="string(number(string(PRICE)))"/> 
        </Price> 
        <Year> 
         <xsl:value-of select="string(floor(number(string(YEAR))))"/> 
        </Year> 
       </DVD> 
      </xsl:for-each> 
     </Collection> 
    </xsl:template> 
</xsl:stylesheet> 

XSLT2 (전체 XML을로드하는 불필요한 변수 "루트"로) :

,536,913,632
넣어 앞뒤로하려면 접근 방식을 변경하는 내 제안을 ...뿐만 아니라 자식 개체로 확장 (10)
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xs="http://www.w3.org/2001/XMLSchema" exclude-result-prefixes="xs"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/> 
    <xsl:template match="/"> 
    <xsl:variable name="root" select="."/> 
     <Collection> 
      <xsl:for-each select="$root/CATALOG/CD"> 
       <DVD> 
        <Cover> 
         <xsl:value-of select="string(TITLE)"/> 
        </Cover> 
        <Author> 
         <xsl:value-of select="string(ARTIST)"/> 
        </Author> 
        <BelongsTo> 
         <xsl:value-of select="concat(concat(string(COUNTRY), ' '), string(COMPANY))"/> 
        </BelongsTo> 
        <SponsoredBy> 
         <xsl:value-of select="string(COMPANY)"/> 
        </SponsoredBy> 
        <Price> 
         <xsl:value-of select="string(number(string(PRICE)))"/> 
        </Price> 
        <Year> 
         <xsl:value-of select="string(floor(number(string(YEAR))))"/> 
        </Year> 
       </DVD> 
      </xsl:for-each> 
     </Collection> 
    </xsl:template> 
</xsl:stylesheet> 

은 접근-2는 실시간으로 존재하고 가리키고는 XML 변수의 XSLT 사용에서 몇 매크로 블럭에 몇 KB 정도를 것 , 그 뒤에 이론을 확인해야합니다.

접근 방식 -2 내 생각에 따르면, 시스템은 메모리에서 XML 데이터를 계속해서 다시로드합니다 (여러 변수를 사용하여 하위 엔티티를로드 할 때 상황이 바뀝니다) 최악의 경우) 변환 프로세스가 느려집니다.

여기에이 질문을 게시하기 전에 타이머를 사용하여 두 개의 XSLT 성능을 테스트했습니다. 첫 번째 접근 방식은 접근 방식 2보다 적은 밀리 초가 소요됩니다. (필자는 시스템 캐쉬로 복잡성을 피하기 위해 copy-XML 파일을 사용하여 두 개의 XSL 파일을 테스트했습니다). 하지만 다시 시스템 캐시가 큰 혼란스러운 역할을 할 수도 있습니다 ..

이 분석에도 불구하고 나는 여전히 염두에두고있는 질문이 있습니다! 우리는 정말로 변수 사용을 피할 필요가 있습니다. 그리고 내 시스템에 관한 한, 실시간 XSLT 파일을 수정하여 '접근 1'을 사용하는 것이 얼마나 가치가 있습니까?

또는 XSLT 변수가 다른 프로그래밍 언어 (Incase가 아닌 경우)와 다릅니다. 예를 들어, XSLT 변수는 실제로 데이터를 저장하지 않습니다. select="." 자료! 또는이 같은 ..? AND HENCE는 주저없이 XSLT 변수를 계속 사용합니다.

당신의 의견은 어떻습니까?

  1. 호스트 프로그래밍 언어 또는 시스템 : 현재 시스템에

    빠른 정보 시벨

  2. XSLT 프로세서 (C++ 백엔드 코드입니다) : Xalan에
(색슨은 명시 적으로 사용하지 않는 한)
+0

대답은 구현에 따라 달라집니다. –

+0

당신이 의미하는 * 구현 * 단어를 자세히 설명해 주시겠습니까? – Enthusiastic

+0

호스트 프로그래밍 언어 (C# - net, Java 등) 또는 XSLT 프로세서 (saxon, xalan 등)가 변경되는 것을 의미합니까 ?? – Enthusiastic

답변

0

특정 XSLT 프로세서의 성능을 측정해야한다는 의견에 동의합니다.

그러나 "접근 방식 2, 시스템에서 XML 데이터를 계속 메모리에 다시로드하는 중"과 같은 귀하의 설명이나 기대는 저에게 잘못되었습니다.XSLT 프로세서는 기본 입력 XML 문서의 입력 트리를 빌드하고 어쨌든 <xsl:variable name="root" select="."/>을 사용한 구현은 문서를 완전히 다시로드하는 것과 같은 일을한다고 상상할 수 없습니다. 노드 ID 및 생성 ID는 잘못되었으므로 작업. 변수는 단순히 기존 입력 트리의 문서 노드에 대한 참조를 유지합니다.

물론 하나의 입력 문서와 현재 노드가 문서 인 단일 템플릿이있는 샘플에서는 어쨌든 가지고있는 변수의 사용은 불필요합니다. 그러나 특히 여러 문서를 처리 할 때 기본 입력 문서의 문서 노드를 저장해야하는 경우가 있습니다.

+0

좋아요 .. 타이머가 다른 것보다 변수가 더 높은 값 (항상)을 반환 한 이유가 있습니다. 시도해 보았습니다. 시스템 캐시를 다루는 모든 모든 가능성 (같은 크기이지만 서로 다른 두 XSLT의 데이터와 이름이 다른 XML과 비슷 함. 테스트를 위해 수행 한 순서도 다름) 아직 1에 가까워 접근 속도는 2 밀리 초 미만임 – Enthusiastic

+0

지식이있는 사람 Xalan 코드베이스의 차이점을 설명 할 수 있거나 코드의 프로파일 러가 시간이 소비되는 위치를 알려줍니다. –