문제

항상 동일한 출력을 제공하는 JSP- 태그를 만드는 것을 고려하고 있습니다. 예를 들어:

<foo:bar>baz</foo:bar>

항상 출력 :

<div class="bar">baz</div>

생성 된 서블릿의 정적 출력처럼 JSP- 태그를 얻을 수있는 방법이 있습니까?

예를 들어:

out.write("<div class=\"bar\">");
...
out.write("</div>");

대신에

x.y.z.foo.BarTag _jspx_th_foo_bar_0 = new x.y.z.foo.BarTag();
_jspx_th_foo_bar_0.setPageContext(pageContext);
_jspx_th_foo_bar_0.setParent(null);
_jspxTagObjects.push(_jspx_th_foo_bar_0);
int _jspx_eval_foo_bar_0 = _jspx_th_foo_bar_0.doStartTag();
etc...
etc...
etc...

배경

성능이 걱정됩니다. 아직 테스트하지는 않았지만 생성 된 서블릿이 매우 간단한 일을 많이하는 것처럼 보이며 성능이 매우 중요합니다.

그러나 Servlet이 JSP에서 출력이 직접 작성된 것처럼 동작하면 생산 비용은 0이됩니다.

나는 이것을함으로써 몇 가지 장점을 본다. 모든 포틀릿을 편집하지 않고 정적 HTML을 변경하거나 더 역동적 인 것으로 변경할 수도 있습니다. 설정에서 태그를 변경하기는 쉽지만 특정 요소를 사용하는 모든 JSP를 변경하는 데 시간이 많이 걸립니다.

이것은 또한 개발자가 같은 것을 쓰지 않도록 강요 할 수 있음을 의미합니다.

<div class="bar" style="whatever">...</div>

더 많은 장점이 있지만 프로덕션 서버의 성능 비용이 드는 경우 가치가 없을 것입니다.

도움이 되었습니까?

해결책 2

나는 성능 테스트를했다. Performace에는 차이가 거의 없으므로 문제가되지 않습니다.

내가 시험을 한 방법

태그 라이브러리 중 하나에서 500 개의 개별 태그 (프로그래밍 방식)를 만들었습니다. (그래서 그것은 항아리 등에 싸여 있습니다.) 그들은 모두 숫자가 유일한 차이점으로 이렇게 보입니다.

package XX.XX.XX.XX

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class Test0001Tag extends TagSupport {

    public Test0001Tag() {
    }

    public int doStartTag() throws JspException {

        try {
            pageContext.getOut().print("<div class=\"Test0001\">");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_BODY_INCLUDE;
    }

    public int doEndTag() throws JspException {
        try {
            pageContext.getOut().print("</div>");
        } catch (IOException e) {
            throw new JspException(e);
        }
        return EVAL_PAGE;
    }

    public void release() {
        super.release();
    }
}

그런 다음 다음과 같은 TLD의 500 개 항목입니다.

<tag>
   <name>test0001</name>
   <tagclass>XX.XX.XX.XX.Test0001Tag</tagclass>
   <bodycontent>JSP</bodycontent> 
</tag>

그런 다음 작은 코드가있는 JSP를 잡고 정적 HTML이 있고 하나는 태그가있는 두 개의 사본을 만들었습니다.

정적 HTML을 가진 사람 :

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<div class="Test0001">X</div>
<div class="Test0002">X</div>
<div class="Test0003">X</div>
...
<div class="Test0498">X</div>
<div class="Test0499">X</div>
<div class="Test0500">X</div>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

태그가있는 것 :

<!-- 
<%long start = System.currentTimeMillis();%>
<% for (int i = 0; i < 1000; i++) { %>
<bddesign:test0001>X</bddesign:test0001>
<bddesign:test0002>X</bddesign:test0002>
<bddesign:test0003>X</bddesign:test0003>
...
<bddesign:test0498>X</bddesign:test0498>
<bddesign:test0499>X</bddesign:test0499>
<bddesign:test0500>X</bddesign:test0500>
<% } %>
<%System.out.println(System.currentTimeMillis()-start);%>
 -->

둘 다 제로 밀리 초로 나왔기 때문에 루프가 도입되었습니다. (불행히도 나는 직장에서 Windows를 실행하므로 여기서 정밀도가 크지 않습니다.) 500 개의 태그가 측정 가능한 지연을 만들지 않았다는 사실은 충분히 대답 할 수 있지만 반복이 허용 할 수있는 경우에도 더 원했습니다. 일부 최적화.

500,000 태그의 결과 :

  • JSP- 태그 : 15-19 초
  • HTML-TAGS : 12-16 초

따라서 차이가 있지만 사용자 클릭에서 답변까지 진행되는 다른 모든 일에 비해 무의미하다고 생각합니다.

다른 생각들

내가 아는 한, 창의 세분성은 약 15-16 밀리 초입니다. 따라서 "0 밀리 초"는 실제로 "16 밀리 초"를 의미합니다. 16/500 밀리 초 미만의 지연 PR. 태그는 상당히 허용됩니다.

나는 1000 개의 태그로 시도했지만 JSP 컴파일러는 그것에 대해 매우 불만을 나타 냈습니다. 대안은 내 결과를 무효화 할 설정을 변경하는 것이기 때문에 500 개의 태그로 줄였습니다.

브라우저가 테스트-서버와 동일한 물리적 기계에 있기 때문에 생성 된 HTML을 HTML-Comment로 만들었고 브라우저가 듀얼 코어 CPU를 사용하더라도 CPU 시간 렌더링이 너무 많을 까봐 두려웠습니다. 쉬운 해결책은 HTML에 주석하는 것이 었습니다.

다른 팁

방금 보여준 코드를 고려할 때 성능 히트가 무시할 것이라고 확신합니다.

나는 궁금했다 ... 왜 평범한 늙음을 사용하지 않는지 포함?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top