2016-08-24 5 views
0

XalanJ 2.7.1과 1.0 호환 xslt 파일을 사용합니다. 우리는 Saxon-EE 9.7을 사용하여 xslt 2.0으로 바꾸고 싶습니다. 그래서 더 빠르게 작동한다면 타당성 조사를하고 싶습니다. XalanJ가 가장 느린 인터넷에서 이전에 모든 연구에서.버전 변경으로 XSL 1.0에서 XSLT 2.0으로 변경

평균 변환 시간은 989ms이지만 Saxon-EE는 버전을 1.0에서 2.0으로 변경하고 동일한 xslt 규칙을 1100ms 평균으로 실행합니다.

우리는 xslt 파일을 다시 작성해야한다는 뜻입니까 아니면 성능 측정에 오류가있는 것입니까? 변환을 변경해야하는 경우 특히 무엇입니까?

편집 2 :

성능 테스트 pourposes를 들어 우리가

final Stopwatch stopwatch = new Stopwatch(); 

TransformerFactory factory = new EnterpriseTransformerFactory(); 
Source xsl = new StreamSource(FileUtils.openInputStream(fileXSL), fileXSL.getAbsolutePath()); 
Transformer transformer = factory.newTransformer(xslt); 
stopwatch.start(); 
transformer.transform(input, output); 
stopwatch.stop(); 

는 그 다음 transfor 방법에 대한 시간을 측정 GugleGuava의 스톱워치를 사용하여 샘플 응용 프로그램을 만듭니다. 변환을 1000 번 실행하고 처음 100 번의 실행을 무시하고 평균 시간을 측정합니다.

편집 3 : 총 시간 : 1816.153 밀리 초 나는 항상은 아니지만, 색슨의 Xalan보다 더 자주 훨씬 빠릅니다 색슨 프로파일을

<table border="border" cellpadding="10"> 
 
    <thead> 
 
    <tr> 
 
     <th>file</th> 
 
     <th>line</th> 
 
     <th>instruction</th> 
 
     <th>count</th> 
 
     <th>average time (gross)</th> 
 
     <th>total time (gross)</th> 
 
     <th>average time (net)</th> 
 
     <th>total time (net)</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>234</td> 
 
     <td>template tplCreateAttribute</td> 
 
     <td align="right">5281262</td> 
 
     <td align="right">0.007</td> 
 
     <td align="right">36443.790</td> 
 
     <td align="right">0.007</td> 
 
     <td align="right">36443.790</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>248</td> 
 
     <td>template tplCreateDateAttribute</td> 
 
     <td align="right">1215364</td> 
 
     <td align="right">0.010</td> 
 
     <td align="right">11722.446</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">9177.567</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>265</td> 
 
     <td>template tplCreateBoolAttribute</td> 
 
     <td align="right">934716</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">7438.999</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">7438.999</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>392</td> 
 
     <td>template fnMathRandomNumber</td> 
 
     <td align="right">1215364</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">5937.933</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">5937.933</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>338</td> 
 
     <td>template tplCreateAttributeOBID</td> 
 
     <td align="right">607682</td> 
 
     <td align="right">0.018</td> 
 
     <td align="right">11004.523</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">5066.590</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>41</td> 
 
     <td>template dcx:object[@class = 'Object']</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">2.599</td> 
 
     <td align="right">809778.821</td> 
 
     <td align="right">0.014</td> 
 
     <td align="right">4316.423</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>318</td> 
 
     <td>template tplCreateAttributeWithDefault</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">0.011</td> 
 
     <td align="right">3500.819</td> 
 
     <td align="right">0.011</td> 
 
     <td align="right">3500.819</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>365</td> 
 
     <td>template tplCreateAttributeObjectState</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">2645.134</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">2645.134</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>376</td> 
 
     <td>template fnDateConvert</td> 
 
     <td align="right">592220</td> 
 
     <td align="right">0.004</td> 
 
     <td align="right">2544.879</td> 
 
     <td align="right">0.004</td> 
 
     <td align="right">2544.879</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>201</td> 
 
     <td>template dcx:object[@class = 'Object Smpl']</td> 
 
     <td align="right">296110</td> 
 
     <td align="right">2.530</td> 
 
     <td align="right">749090.244</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">1545.430</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>33</td> 
 
     <td>template /</td> 
 
     <td align="right">1</td> 
 
     <td align="right">78836.780</td> 
 
     <td align="right">78836.780</td> 
 
     <td align="right">219.216</td> 
 
     <td align="right">219.216</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>26</td> 
 
     <td>variable constAlphabetUpperCase</td> 
 
     <td align="right">2</td> 
 
     <td align="right">0.229</td> 
 
     <td align="right">0.458</td> 
 
     <td align="right">0.229</td> 
 
     <td align="right">0.458</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

+2

적어도 Saxon의 API 및 트리 모델을 사용하거나 JAXP와 DOM을 입력으로 사용하여 명령 줄 또는 Java 응용 프로그램에서 Saxon을 실행 한 것과 사용자가 측정 한 방법 및 내용을 설명하십시오. –

+0

어떤 종류의'input'이 전달 되는가? Saxon이 자신의 트리 모델을 사용할 수 있도록'StreamSource' 또는'SAXSource'를 사용할 수 있습니까? 아니면 당신이 사용하는'DOMSource'입니까? –

+0

StreamSource 내가 사용하는 것 – Xelian

답변

1

를 사용하여 통계 분석을했다. 그것은 모두 의존합니다 : 성능으로 악마는 상세하게 있습니다. 때로는 변환 비용보다는 파싱에 의해 성능이 좌우되는 경우가 있습니다. Martin Honnen의 말처럼 Saxon에서 DOMSource를 사용하는 것은 매우 느릴 수 있습니다. (Saxon은 노드 이름을 일치시키기 위해 정수 지문을 사용하여 큰 이득을 얻었으며 표준 DOM에서 실행할 때 수행 할 수 없습니다.)

변경되지 않은 XSLT 1.0 스타일 시트를 2.0 프로세서에서 실행하면 항상 약간 왜냐하면 프로세서는 실행 시간에 모든 것을 결정해야하므로 타입 정보 (예 : 변수에 대한 타입 선언 없음)가 거의 없기 때문입니다. 추가가 정수, double, 부동 또는 십진수인지 여부와 변환이 필요한지 여부. 반대로 1.0 프로세스에는 이중 산술 만 있으므로 의사 결정이 훨씬 쉽습니다. 따라서 2.0 프로세서에는 본질적인 단점이 있습니다. 그러나 대체로 Saxon은 여전히 ​​승리합니다.

인터넷에서 일화적인 증거를 찾고 있다면 사람들이 항상 이전 Xalan-J 인터프리터 또는 최신 XSLTC 컴파일러에 대해 이야기하고 있는지 명확하게 알 수는 없다는 것을 알아야합니다. 훨씬 더 빨리.

우리가 귀하의 질문에서 알 수없는 한 가지는 XSLT 코드가 잘 작성되었는지 아닌지입니다. 이것은 양날의 칼입니다. Saxon-EE는 다른 대부분의 제품보다 더 강력한 옵티 마이저를 가지고 있습니다. 코드가 매우 잘 작성되었거나 매우 간단하다면, 코드를 개선하기 위해 많은 노력을 기울일 수 없기 때문에 큰 장점이 아닙니다. 마찬가지로 코드가 괴롭다면 옵티마이 저가 저장하지 않을 것입니다. 그 사이에는 좋은 최적화가 가끔 20 배 이상 (또는 그 이상)으로 나아갈 수있는 중간 지점이 있습니다. 내가 말했듯이, 악마는 세부 사항에있다.

+0

xslt가 나쁘다는 말을하기가 어렵다. 그리고 xslt가 간단하다면 여기에 비교 대상에 따라 다릅니다. 그러나 테스트를 위해 프로젝트에서 가장 간단한 변환을 사용합니다. 우리는 성능 문제로 인해 좋은 xslt-s를 작성하려고합니다. xPath 선택에 "//"사용하지 않고, 명명 된 템플릿을 사용하고, 선택 문을 줄이는 등의 작업을 시도합니다. xslt에는 비즈니스 특정 논리가 포함되어 있으므로 여기에 게시 할 수 없습니다. – Xelian

+1

Xalan에서 성능이 좋지 않아 "//"과 같은 구조를 피했다면 Saxon이 최적화 된 구조 중 하나이기 때문에 수치 스럽습니다. 실제로 성능이 크게 향상 될 수 있습니다. 이런 종류의 토론은 기본적으로 코드를보고 세부 사항으로 들어가기 전까지는 아무데도 쓰이지 않습니다. –

+0

네, 이해하지만 당신 말이 맞아요.하지만 1MB에 달하는 엄청난 양의 xslt가 있습니다. 그러면 다른 시나리오를 추출하는 것이 좋겠지 만 시도해 보겠습니다. 주제의 주된 목적은 saxon EE에 대한 변환 버전을 변경하는 것의 단점이 있음을 이해하는 것이 었습니다. Xampath에서 xslt 프로세서는 실행 시간을 결정해야한다는 것을 언급했습니다. 실제 유형입니다. 따라서 마이그레이션의 작업을 줄이려는 욕구 때문에 xslt 2.0의 잘못된 사용으로 인해 변환 속도가 느립니다. 이 같은 것을 알고 싶습니다 – Xelian

관련 문제