文档章节

Thymeleaf模板性能测试

leon_rock
 leon_rock
发布于 2014/11/02 05:44
字数 736
阅读 15654
收藏 14

1 Beetl

2 FreeMarker

3 Thymeleaf

对于这三种模板的介绍可以在oschina上查看,对于前两者比较熟悉,对Thymeleaf是新的认识,Thymeleaf有一个地方本人很喜欢,模板页面静态或者动态打开可以正常显示,方便前端测试和后端分离开发,下面是对三者的性能测试。

通过 @闲.大赋 ,找到了测试工具TEB, http://git.oschina.net/kiang/teb @kiang

__________________________________________________________________________________________________________________________

发现Beetl和FreeMarker测试弄能代码都已经实现,于是对Thymeleaf进行了添加, 这里本人第一次用Thymeleaf所以不清楚对Thymeleaf配置是否对它性能产生了影响,下面直接代码:

package kiang.tei;

import kiang.teb.TebEngine;
import kiang.teb.TebModel;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.FileTemplateResolver;

import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @author eyeLee(yinjun622@163.com)
 *         Time 2014/11/1.
 */
public class Thymeleaf implements TebEngine {

    private TemplateEngine engine;

    @Override
    public TebEngine init(Properties properties) throws Exception {

        FileTemplateResolver templateResolver =  new FileTemplateResolver();
        templateResolver.setPrefix("./src/kiang/tpl/");
        templateResolver.setSuffix(".tpl");
        templateResolver.setCharacterEncoding("UTF-8");
        templateResolver.setTemplateMode("XHTML");

        engine = new TemplateEngine();
        engine.setTemplateResolver(templateResolver);
        engine.initialize();
        return this;
    }

    @Override
    public void test(Map arguments, Writer writer) throws Exception {
        Context ctx = new Context();
        ctx.setVariables(arguments);
        engine.process("thymeleaf",  ctx, writer);
    }

    @Override
    public void test(Map arguments, OutputStream output) throws Exception {
    }

    @Override
    public void shut() throws Exception {

    }

    @Override
    public boolean isBinarySupport() {
        return false;
    }

    public static void main(String args[]) throws Exception {
        String source="UTF-8", target = "UTF-8";
        Writer writer = new OutputStreamWriter(System.out, target);
        Map data = new HashMap();
        data.put("target", target);
        data.put("models", TebModel.dummyModels(20));
        Properties properties = new Properties();
        properties.setProperty("source", source);
        properties.setProperty("target", target);
        properties.setProperty("binary", String.valueOf(true));
        TebEngine engine = new Thymeleaf().init(properties);
        engine.test(data, writer);
        writer.flush();
        engine.shut();
    }

}

页面代码:

<html>
<head>
    <title>Thymeleaf!!!!!</title>
    <meta http-equiv="Content-Type" content="text/html;" th:charset="${target}"/>
    <style type="text/css">
        body { font-size: 10pt; color: #333333; }
        thead { font-weight: bold; background-color: #C8FBAF; }
        td { font-size: 10pt; text-align: center; }
        .odd { background-color: #F3DEFB; }
        .even { background-color: #EFFFF8; }
    </style>
</head>
<body>
    <h1>Template Engine Benchmark - Thymeleaf!!!!!</h1>
    <table>
        <thead>
            <tr>
                <th>序号</th>
                <th>编码</th>
                <th>名称</th>
                <th>日期</th>
                <th>值</th>
            </tr>
        </thead>
        <tbody>
            <tr th:each="model : ${models}" th:class="${modelStat.odd}? 'odd' : 'even'"  >
                <td th:text="${modelStat.index}"></td>
                <td th:text="${model.code}"></td>
                <td th:text="${model.name}"></td>
                <td th:text="${model.date}"></td>
                <td th:text="${model.value}"></td>
                <td th:if="${model.value} > 105.5" style="color: red" th:text="${model.value}+'%'"></td>
                <td th:unless="${model.value} > 105.5" style="color: blue" th:text="${model.value}+'%'"></td>
            </tr>
        </tbody>
    </table>
</body>
</html>

在TEB配置文件中添加Thymeleaf项:

#Thymeleaf
thy.name=Thymeleaf 2.1.3
thy.site=http://thymeleaf.com
thy.test=kiang.tei.Thymeleaf

完整代码地址:http://git.oschina.net/yinjun622/teb

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

测试结果:

TPS       : 引擎的吞吐量, 单位时间内引擎渲染次数, 单位: 次/秒
Time      : 引擎全部渲染的执行时间, 单位: 毫秒
OnceIo    : 引擎单次渲染的IO次数, 单位: 次
MassIo    : 引擎全部渲染的IO次数, 单位: 次
OnceOut   : 引擎单次渲染的输出字节(字符)数, 单位: 字节/字符
MassOut   : 引擎全部渲染的输出字节(字符)数, 单位: 字节/字符
PermMem   : 内存消耗, 内存取新生代之外的内存(新生代内存会被很快回收), 单位: 字节

通过测试结果发现,Thymeleaf与beetl不在一个数量级上,在并发和渲染时间上有巨大的差距

 

 

 

© 著作权归作者所有

leon_rock

leon_rock

粉丝 73
博文 75
码字总数 17541
作品 0
大连
高级程序员
私信 提问
加载中

评论(12)

MGL_ONE
MGL_ONE
用它(thymeleaf)来生成HTML , 喜欢它是因为真正做到了前后台分离,我相信性能越来越会提升的!
冠岑
冠岑

引用来自“小鲅鱼”的评论

引用来自“Qiannan”的评论

Thymeleaf 3.0的性能怎么样?

没有测试过~

引用来自“ff100”的评论

测试下看看。听说Thymeleaf 3.0性能提升了不少。
https://github.com/jreijn/spring-comparing-template-engines/issues/19
thymeleaf3.0依然垫底,性能差距比倒数第二名差了70%左右。
ff100
ff100

引用来自“小鲅鱼”的评论

引用来自“Qiannan”的评论

Thymeleaf 3.0的性能怎么样?

没有测试过~
测试下看看。听说Thymeleaf 3.0性能提升了不少。
leon_rock
leon_rock 博主

引用来自“Qiannan”的评论

Thymeleaf 3.0的性能怎么样?

没有测试过~
Qiannan
Qiannan
Thymeleaf 3.0的性能怎么样?
leon_rock
leon_rock 博主

引用来自“3413”的评论

Thymeleaf有一个地方本人很喜欢,模板页面静态或者动态打开可以正常显示,方便前端测试和后端分离开发,下面是对三者的性能测试。
th:include and th:replace layout:decorato这些引用后,表明静态与动态完全就是不同的页面,不觉得natural?
一般开发起来后,页面的逻辑复杂时,项目迭代多时,静态页面会渐渐消失,Thymeleaf特性用不上~
3
3413
Thymeleaf有一个地方本人很喜欢,模板页面静态或者动态打开可以正常显示,方便前端测试和后端分离开发,下面是对三者的性能测试。
th:include and th:replace layout:decorato这些引用后,表明静态与动态完全就是不同的页面,不觉得natural?
bluntFish
bluntFish
晕,刚刚选用了thymeleaf,没想到性能 指标这么差啊
leon_rock
leon_rock 博主

引用来自“闲.大赋”的评论

beetl其实是最支持前后端分离的,为什么这么讲,前后端分离,这意味着允许前端人员单独开发和测试模板。只有beetl才提供这样的技术完成。你可以参考手册4.10直接运行web模板。另外beetl支持自定义定界符和站位符号,你只要定义成<!--: ,不用布局标签高级特性,基本上能保证浏览器能打开模板
所以beetl不但在性能上远远比thymeleaf高,甚至你说的俩个特性恰恰是beetl的强项
beetl mvc这块知道,欣赏thymeleaf一点是可以不用破话原来静态页面,通过标签属性来进行
leon_rock
leon_rock 博主

引用来自“闲.大赋”的评论

另外,Thymeleaf我早听说很差,但看这个性能测试,除了性能指标以外,没想到其他指标很糟糕,输出了过多的字节,占用了过多的perm区
他的标签方法不是很喜欢,之前一直用beelt快乐着,切换到Thymeleaf感觉很糟糕~~
spring boot打成jar后生成静态文件文件

使用spring boot,模板使用thymeleaf。项目打成jar。 有一个业务需求,也为了提高性能,需要生成静态html文件,并且供其他thymeleaf模板引用。 那么,这个时候因为项目是jar的,如何才能在t...

unix
2017/08/24
613
2
Springnboot整合Thymeleaf

Thymeleaf和Fremarker一样是静态模板,两者整合方式相似,使用的时候二者选择其一即可,整合步骤如下: 1,在pom.xml中引入Thymeleaf的依赖 2,在application.properties中进行thymeleaf模板配...

zq木偶人
2018/07/21
0
0
Thymeleaf 2.0 发布,HTML5 模板引擎

Thymeleaf 2.0 发布了,该版本主要改进: 性能提升:完全重写的模板执行引擎,几乎重新设计的内部架构,性能较1.1版本有了大幅提升。 在standard dialects 版本中新增了th:switch/th:case属性...

鉴客
2012/02/09
1K
0
SpringMVC项目使用Thymeleaf模板引擎

前言:本文基于上一篇内容-Spring+SpringMVC项目搭建 Thymeleaf简介 Thymeleaf是个XML/XHTML/HTML5模板引擎,可以用于Web与非Web应用。Thymeleaf很大的一个特点就是,它支持使用html格式的文...

lixuelong
2016/02/20
495
0
Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml 配置application.properties 模板页index.html 控制器Controller 测试 完整代码 https://gitee.com/yysue/tutorials-java...

yysue
2018/06/20
66
0

没有更多内容

加载失败,请刷新页面

加载更多

学习记录 java面试题(一)

1. JDK和JRE的区别 JDK是整个JAVA的核心,包括了Java运行环境JRE,一堆Java工具和Java基础的类库。通过JDK开发人员将源码 文件(java文件)编译成字节码文件(class文件)。 JRE是Java运行环境,...

Pole丶逐
24分钟前
5
0
springboot 部署到外部tomcat

入口类继承SpringBootServletInitializer 并重写protected SpringApplicationBuilder configure(SpringApplicationBuilder builder)方法 如下 import org.springframework.boot.SpringApplic......

雷开你的门
30分钟前
4
0
hashCode和equals方法的关系

equals相等,hashcode必相等; hashCode()在哈希表中起作用,如HashSet、HashMap等。 当我们向哈希表(如HashSet、HashMap等)中添加对象object时,首先调用hashCode()方法计算object的哈希码,...

无名氏的程序员
35分钟前
2
0
技术分享 | MySQL 慢查询记录原理和内容解析

作者:高鹏 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 源码版本:percona 5.7.14 本文为学习记录,可能有误请谅解,也提供了一些...

爱可生
43分钟前
3
0
elementui 树型节点

节点选择时,勾选节点。 提交给后端时,传递 this.$refs.menuTree.getCheckedKeys(); 半选父节点 getHalfCheckedKeys() 不需要提交。...

东东笔记
44分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部