我做了一个性能测试。性能差异很小,所以没问题。
我是如何进行测试的
我在我们的一个标签库中创建了 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 标签:12-16 秒
所以有区别,但我认为与从用户点击到答案呈现在屏幕上的所有其他事情相比,它是微不足道的。
其他想法
据我所知,Windows 中的粒度约为 15-16 毫秒。所以“0毫秒”实际上意味着“<16毫秒”。小于 16/500 毫秒的延迟。标签是完全可以接受的。
我尝试了 1000 个标签,但 JSP 编译器对此非常不满意。我减少到 500 个标签,因为另一种方法是更改设置,这会使我的结果无效。
我将生成的 HTML 设置为 HTML 注释,因为浏览器与测试服务器位于同一台物理机器上,而且我担心浏览器会占用过多的 CPU 时间渲染,即使是双核 CPU。简单的解决方案是注释 HTML。