为什么JSP会比Beetl慢
转自:http://my.oschina.net/xiandafu/blog/475740
JSP是预编译成class的,然后模板渲染里比Beetl慢很多,文章从JSP静态文本处理不足,以及JSTL实现低效来说明JSP实际上要比Beetl慢2倍,FreeMarker比Beetl慢6倍多。从客观的基准测试和第三方性能测试也能证明这一点。
许多人都不相信这个事实,作为前端常用渲染技术,JSP比Beetl慢。如果稍微了解这俩种技术的人,会分析:JSP是编译成class的,而 Beetl总是解释执行的。JSP肯定会比Beetl快。然而,事实并不是这样,通过了许多性能测试,证明,Beetl还是要快的,如下是TEB模板引擎 性能基准测试结果:
采用jfinal+beetl模板,apache ab压力测试结果
- Time taken for tests: 0.656 seconds
- Complete requests: 1000
- Time per request: 32.813 [ms] (mean)
未采用beetl,apache ab测试结果:
- Time taken for tests: 1.297 seconds
- Complete requests: 1000
- Time per request: 64.844 [ms] (mean)
究竟怎么回事情,使得编译执行的JSP执行比解释执行的Beetl慢。基本上来说,Beetl并没有做出超越常规的性能优化,而是JSP本身性能优化不够导致的。
。如果你看看JSP编译的后的java代码(以Tocmat7为例),你会发现,JSP并没有优化好静态文本输出。如下一个JSP代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Test JSP</title>
</head>
<body>
<%
String a = "Test JSP";
%>
<%=a %>
</body>
</html>。
Tomcat7 会编译成为
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\"
content=\"text/html; charset=ISO-8859-1\">\r\n");
out.write("<title>Test JSP</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
String a = "Test JSP";
out.write('\r');
out.write('\n');
out.print(a );
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
可以看出,对于静态文本,JSP会多次调用out.write方法,而write方法内部,每次调用,都会做flush检测等耗时机制。因此,更好的方式应该是将静态文本合并一次性输出,应该是下面这种会更好点
// 期望JSP的样子
out.write("<html>\r\n<head>\r\n ....<body>\r\n“);
String a = "Test JSP";
out.write("\r\n“);
out.print(a );
out.write("\r\n</body>\r\n</html>");
public static void main(String[] args)throws Exception {
String text = "<html>你好中文!你好中文!你好中文!</html>";
{
//模拟jsp
long start = System.currentTimeMillis();
for(int i=0;i<1000000;i++){
byte[] bs = text.getBytes("UTF-8");
write(bs);
}
long end = System.currentTimeMillis();
System.out.println("jsp total="+(end-start));
}
{
// 模拟beetl
long start = System.currentTimeMillis();
byte[] bs = text.getBytes("UTF-8");
for(int i=0;i<1000000;i++){
write(bs);
}
long end = System.currentTimeMillis();
System.out.println("beetl total="+(end-start));
}
}
public static void write(byte[] bs){
}
输出是:
jsp total=228
beetl total=3
<c:choose>
<c:when test="${param.newFlag== '1' || param.newFlag== '2'}">
<th>1 or 2 <font color="Red">*</font>
</c:when>
</c:choose>
在我最初的想象里,我认为jsp至少会编译成如下代码:
//期望JSP能编译成如下代码
if(request.getParameter("newFlag").equals("1")
||request.getParameter("newFlag").equals("2")){
out.print(...)
}
但事实并不是这样,对于如上JSTL,编译成
// 实际上JSP编译的代码
out.write((java.lang.String)
org.apache.jasper.runtime.PageContextImpl.proprietaryEvaluate(
"${param.newFlag== '1' || param.newFlag== '2'}",
java.lang.String.class,
(javax.servlet.jsp.PageContext)_jspx_page_context, null, false));
也就是,JSP并没有如预期的预编译成java代码,而是动态解释执行了 test条件,这样,性能不差才怪呢.
为什么JSP会比Beetl慢的更多相关文章
- Beetl 3中文文档 转载 http://ibeetl.com/guide/
Beetl作者:李家智(闲大赋) <xiandafu@126.com> 1. 什么是Beetl 广告:闲大赋知识星球,付费会员 Beetl( 发音同Beetle ) 目前版本是3.0.7, ...
- Beetl2.2使用说明书20151201
李家智<xiandafu@126.com> Table of Contents 1. 什么是Beetl 2. 基本用法 2.1. 从GroupTemplate开始 2.2. 模板基础配置 ...
- java开源模板引擎
Velocity Velocity是一个基于java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义 ...
- Jsp与beetl的比较
首先介绍一下模板引擎的概念,是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎,就会生成一个标准的html文档. Jsp全名是JavaServer Page,中文名叫 ...
- beetl 配置多视图解析器
如下配置,指定了三个视图解析器,一个用于beetl页面渲染,一个用于cms,采用了beetl技术,另外一个一些遗留的页面采用jsp <bean name="beetlConfig&qu ...
- 2019-04-18 Beetl模板学习
1. beetl的安装 使用maven: <dependency> <groupId>com.ibeetl</groupId> <artifactId> ...
- 基于jeesite的cms系统(四):使用Beetl模版引擎在后端渲染数据
一.Beetl简介 1. 什么是Beetl Beetl目前版本是2.9.3,相对于其他java模板引擎,具有功能齐全,语法直观,性能超高,以及编写的模板容易维护等特点.使得开发和维护模板有很好的体验. ...
- beetl模板的${!}用法
转自:http://ibeetl.com/guide/#beetl 2.20. 安全输出 安全输出是任何一个模板引擎必须重视的问题,否则,将极大困扰模板开发者.Beetl中,如果要输出的模板变量为nu ...
- Beetl使用注意事项
1.如果表达式跟定界符或者占位符有冲突,可以在用 “\” 符号 @for(user in users){ email is ${user.name}\@163.com @} ${[1,2,3]} // ...
随机推荐
- tcpdump 的正确食用方法
目录 tcpdump 使用笔记 重要报文头 字段表 ip header tcp header 基础使用 高级版本 指定ttl(通过ttl能够确定系统的类型) tcpdump 使用笔记 重要报文头 字段 ...
- Qt+json
Json文件是这样: { "first fruit": { "describe":"an apple", "icon": ...
- HBase参数优化
zookeeper.session.timeout默认值:3分钟(180000ms)说明:RegionServer与Zookeeper间的连接超时时间.当超时时间到后,ReigonServer会被Zo ...
- sqlmap简单使用方法
sqlmap使用 注入点 http://1xx.xxx.xxx.xxxx/dvwa/vulnerabilities/sqli/index.php?id=1&Submit=Submit# 通 ...
- 关于LIS和LCS问题的o(nlogn)解法
o(n^2)解法就不赘述了,直接解释o(nlogn)解法 LIS最长递增子序列: 先明确一个结论:在长度最大为len的递增序列里若末尾元素越小,该递增序列越容易和后面的子序列构造出一个更长的递增子序列 ...
- 在Github上搭建博客
貌似还是这个链接最靠谱呀 http://my.oschina.net/nark/blog/116299 如何利用github建立个人博客:之一 在线编辑器http://markable.in/ed ...
- sqlite的时间筛选字段
唉,需要不停的踩坑呀 commandText = commandText + string.Format("where [CollectDateTime] <'{0}' and [Co ...
- HTML和CSS美化 登入框的页面
<div id="leftbody"> <p class="p0">如果您感觉您的网站够炫美可以提交给我们!</p> < ...
- Java Minor GC和FullGC
Minor GC触发条件:当Eden区满时,触发Minor GC. Full GC触发条件: 调用System.gc时,系统建议执行Full GC,但是不必然执行 老年代空间不足 方法去空间不足 通过 ...
- 上海仪电Azure Stack技术深入浅出系列2:Azure Stack与Azure的有QoS保证的网络联通实现方法和对比测试
本篇文章作为<Azure Stack技术深入浅出系列>的第二篇,将描述我们目前在构建基于Azure Stack混合云业务解决方案方面所面临的网络连通困难,以及相关技术人员为解决这一问题所做 ...