`
jindw
  • 浏览: 510069 次
  • 性别: Icon_minigender_1
  • 来自: 初到北京
社区版块
存档分类
最新评论

几款模板引擎的性能对比

    博客分类:
  • Java
阅读更多
原作者,allskystar


参评的几款模板引擎为:



性能评测考虑以下几个方面:变量输出/循环/分支,这三大类调用构成了普通模板80%以上的功能。
测试方法为双层循环,输出的中间体是一个空的不执行任何操作的Writer类,
尽可能的减少模板外的性能影响因素,基本的逻辑伪代码描述如下:
for (int i = 0; i < outerTime; i++) {
  for (int j = 0; j < innerTime; j++) {
    testXMLTemplate();
  }
  for (int j = 0; j < innerTime; j++) {
    testVelocityTemplate();
  }
  for (int j = 0; j < innerTime; j++) {
    testCommonTemplate();
  }
  for (int j = 0; j < innerTime; j++) {
    testFreeMarker();
  }
  for (int j = 0; j < innerTime; j++) {
    testSmarty4j();
  }
  for (int j = 0; j < innerTime; j++) {
    testJavaCode();
  }
}


第一步,测试循环输出ascii码表,各模板引擎文件为

XT:asciitable.xhtml
<div xmlns:c="http://www.xidea.org/ns/template/core">
  <h1>${name}</h1>
  <table border="${border}">
    <tr>
      <th>&#160;</th>
      <c:for var="cell" items="${data}">
      <th>${cell}</th>
      </c:for>
    </tr>
    <c:for var="row" items="${data}">
    <tr>
        <th>${row}</th>
        <c:for var="cell" items="${data}">
          <td><c:out value="&amp;#x"/>${row}${cell};</td>
        </c:for>
    </tr>
    </c:for>
  </table>
</div>


VT:asciitable.vm
<div>
<h1>${name}</h1>
<table border="${border}">
 <tr>
  <th>&#160;</th>
#foreach($cell in $data)
  <th>${cell}</th>
#end
 </tr>
#foreach($row in $data)
 <tr>
  <th>${row}</th>
#foreach($cell in $data )
  <td>&#x${row}${cell};</td>
#end
 </tr>
#end
</table>
</div>


CT:asciitable.ct
<div>
<h1>${name}</h1>
<table border="${border}">
 <tr>
  <th>&#160;</th>
$for{cell:data}
  <th>${cell}</th>
$end
 </tr>
$for{row:data}
 <tr>
  <th>${row}</th>
$for{cell:data}
  <td>&#x${row}${cell};</td>
$end
 </tr>
$end
</table>
</div>


FT:asciitable.ftl
<div>
<h1>${name}</h1>
<table border="${border}">
 <tr>
  <th>&#160;</th>
<#list data as cell>
  <th>${cell}</th>
</#list>
 </tr>
<#list data as row>
 <tr>
  <th>${row}</th>
<#list data as cell>
  <td>&#x${row}${cell};</td>
</#list>
 </tr>
</#list>
</table>
</div>

ST:asciitable.html
<div>
<h1>{$name}</h1>
<table border="{$border}">
 <tr>
  <th>&#160;</th>
{section loop=$data name="cell"}
  <th>{$cell}</th>
{/section}
 </tr>
{section loop=$data name="row"}
 <tr>
  <th>{$row}</th>
{section loop=$data name="cell"}
  <td>&#x{$row}{$cell};</td>
{/section}
 </tr>
{/section}
</table>
</div>


JAVA:asciitable.java
package org.jside.tt;

import java.io.Writer;
import java.util.List;
import java.util.Map;

public class asciitable implements ICode {

  @Override
  public void execute(Map<String, Object> context, Writer writer) throws Exception {
    List<String> data = (List<String>) context.get("data");
    String name = (String) context.get("name");
    String border = (String) context.get("border");
    writer.write("<div>\n<h1>");
    writer.write(name);
    writer.write("</h1>\n<table border=\"");
    writer.write(border);
    writer.write("\">\n\t<tr>\n\t\t<th>&#160;</th>\n");
    for (String cell : data) {
      writer.write("\t\t<th>");
      writer.write(cell);
      writer.write("</th>\n");
    }
    writer.write("\t</tr>\n");
    for (String row : data) {
      writer.write("\t<tr>\n<th>");
      writer.write(row);
      writer.write("</th>\n");
      for (String cell : data) {
        writer.write("\t\t<td>&#x");
        writer.write(row);
        writer.write(cell);
        writer.write("</td>\n");
      }
      writer.write("\t</tr>\n");
    }
    writer.write("</table>\n</div>\n");
  }

}


在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:

=============runing time===============
引用
xt:2149
vt:3499
ct:72254
ft:2761
st:1235
CODE:1321


第二步,在最内层的循环中多输出一个对象,测试新增输出时的性能影响,最内层的那一行改造如下:
XT:
<td>${name}:<c:out value="&amp;#x"/>${row}${cell};</td>
VT:
<td>${name}:&#x${row}${cell};</td>
CT:
<td>${name}:&#x${row}${cell};</td>
FT:
<td>${name}:&#x${row}${cell};</td>
ST:
<td>{$name}:&#x{$row}{$cell};</td>
JAVA:
        writer.write("\t\t<td>");
        writer.write(name);
        writer.write(":&#x");
        writer.write(row);
        writer.write(cell);
        writer.write("</td>\n");


在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:
=============runing time===============
引用
xt:3549
vt:4748
ct:103453
ft:4251
st:1750
CODE:1811


第三步,测试分支判断对整体性能的影响,在最内层的循环中输出前加一个分支控制,使它仅输出A-Z对应的ASCII码表,改造如下:
XT:
<td><c:if test="${(row=='4' &amp;&amp; cell!='0') || (row=='5' &amp;&amp; cell&lt;'B')}"><c:out value="&amp;#x"/>${row}${cell};</c:if><c:else><c:out value="&amp;"/>nbsp;</c:else></td>
VT:
<td>#if(($row=="4" && $cell!="0") || ($row=="5" && $cell!="B" && $cell!="C" && $cell!="D" && $cell!="E" && $cell!="F"))&#x${row}${cell};#else&nbsp;#end</td>
CT:
<td>$if{(row=="4" && cell!="0") || (row=="5" && cell<"B")}&#x${row}${cell};$else{}&nbsp;$end</td>
FT:
<td><#if (row?string=="4" && cell?string!="0") || (row?string=='5' && cell?string!='B' && cell?string!='C' && cell?string!='D' && cell?string!='E' && cell?string!='F')>&#x${row}${cell};<#else>&nbsp;</#if></td>
ST:
<td>{if ($row==='4' && $cell!=='0') || ($row==='5' && $cell<'B')}&#x{$row}{$cell};{else}&nbsp;{/if}</td>
JAVA:
        writer.write("\t\t<td>");
        if ((row.equals("4") && !cell.equals("0"))
            || (row.equals("5") && cell.compareTo("B") < 0)) {
          writer.write("&#x");
          writer.write(row);
          writer.write(cell);
        } else {
          writer.write("&nbsp;");
        }
        writer.write("</td>\n");

考虑到比较的问题,也可以对整个循环进行优化
    for (String row : data) {
      char cRow = row.charAt(0);
      writer.write("\t<tr>\n<th>");
      writer.write(row);
      writer.write("</th>\n");
      for (String cell : data) {
        char cCell = cell.charAt(0);
        writer.write("\t\t<td>");
        if ((cRow == '4' && cCell != '0') || (cRow == '5' && cCell < 'B')) {
          writer.write("&#x");
          writer.write(row);
          writer.write(cell);
        } else {
          writer.write("&nbsp;");
        }
        writer.write("</td>\n");
      }
      writer.write("\t</tr>\n");
    }

在outerTime=100与innerTime=100时,共循环10000次,平均的结果约是:

=============runing time===============
引用
xt:3498
vt:2422
ct:153280
ft:7124
st:1142
CODE:1027(优化后940)


结论:
ST在三种常见的模板操作中的表现均极其优秀,除了条件处理效率略低于直接书写的JAVA代码,其它情况下与直接书写JAVA代码效率完全一致,而且在三种操作中,总的执行开销差异非常小。
XT在分支的处理中考虑与JS兼容带来了额外开销,但总体性能仍然占优,只是如果需要过多的XML转义可能影响阅读
FT在分支测试中表现差的原因应该是写法不是最优的,总体来说,性能与VT不相上下
CT的表现最差,在各项操作中均比其它的引擎慢了1-2个数量级

有关的测试代码可以在http://templatetest.googlecode.com/svn/trunk/获得
分享到:
评论
41 楼 javamonkey 2014-09-03  
有点老了,有个Teb测试,这个性能测试很标准
http://git.oschina.net/kiang/teb
40 楼 greenlaw110 2013-04-11  
xuyao 写道
sdh5724 写道
xuyao 写道
很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。



不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。

股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。


楼主可以尝试一下rythm引擎,

产品特性(包括性能比较):http://rythmengine.org/doc/feature
线上体验:http://fiddle.rythmengine.org/

申明一下,这是给自己的产品打广告了。
39 楼 hideto 2009-02-17  
赤裸裸的广告贴啊
38 楼 swit1983 2009-02-13  
用模板和用JSP有什么不一样,功能一样效率不一样?
37 楼 xo_knight 2009-01-15  
我用的也是vm
36 楼 alexwan 2009-01-09  
freemarker确实好用
35 楼 allskystar 2008-12-23  
其实也不必非要换模板,必竟在普通的Web应用中,要提高性能需要优化的地方太多,tomcat一分钟假如处理50000个连接,就算是最坏的测试结果里面,大部分模板之间50000次的处理速度也就差了个10s钟,这还是因为里面有循环和复杂的条件判断,只是简单的拼字符串的话,估计能差上1秒就是奇迹了.
高速的处理模板用于嵌入的字符串拼接可能更有用,例如拼接SQL字符串(用hibernate的不用考虑),或者做一些条件处理(例如把1转换为apple,2转换为banana等等,用模板修改起来比较自由)
34 楼 sdh5724 2008-12-20  
xuyao 写道
sdh5724 写道
xuyao 写道
很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。



不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。

股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。



, 如果你是需要极度的性能, 如果定义好输出格式了。 那么就这么一个要特别的PAGE, 我觉得, 你就因该使用特殊的办法,  毕竟, 通用的东西性能是有限制的。 比如,
1。 内存的分配上, 使用固定内存分配, 内存自己管理, 不要让JVM回收。 JAVA的内存会影响你输出性能。
2。 自己直接操作byte数组, 然后输出到servlet流里去。
毕竟这块东西可以被封装成API给PAGE使用。 你选择渲染工具, 本就是找抽的行为, 话是难听了点, 但是, 你真是为客户提供这么高性能的输出, 是非常需要的。 一切都自己手动控制高性能要求的地方。

我没有做过股票的东西, 不知道是不是每次请求的数据都会造成要渲染的问题, 如果不是的话, 你可以采取一些技巧,避免每次都要计算。采用部分数据输出, 然后客户端持有部分数据然后, 使用JS部分渲染图表。  最近看GOOGLE的做的很不错。FLASH做的很漂亮。 不过, 感觉图表数据不够丰富。




33 楼 allskystar 2008-12-17  
bcw104 写道
jindw 写道
ray_linn 写道
st ... 一个连doc都没有的项目就算了

可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。

请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty


用模板肯定比直接写代码要慢的,st只是性能相对来说最好而已
模板引擎主要还是为了改善阅读性吧,逻辑上把业务和显示分开

刚又测试了一下st在各个阶段的时间,发现就语法加载和识别来说,st比vt还快上1-2倍,比别的引擎快上1-2个数量级,但是加上翻译成机器字节码,st就比不上vt编译速度快了,要慢20-30%,除非重写asm包,否则编译速度很难有质的飞跃了。
32 楼 bcw104 2008-12-17  
jindw 写道
ray_linn 写道
st ... 一个连doc都没有的项目就算了

可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。

请问使用模板引擎除了速度能试提升以外还有别的好处吗?JAVA方面还没用过,php上道是用过smarty
31 楼 allskystar 2008-12-17  
可乐熊 写道
确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。


同一个数量级内性能不会成为问题,但差上1个数量级就不一定了,意味着同样的服务器配置,能支撑的最大负荷可能就增加了1-2倍
30 楼 可乐熊 2008-12-17  
确实,其实在现实系统中模板并不会成为性能瓶颈,主要还是看功能,具体到具体项目,有时它的一个简单附加能节省很多代码、或者让结构特别清晰,这才是我最看重的。
29 楼 jindw 2008-12-17  
ray_linn 写道
st ... 一个连doc都没有的项目就算了

可不要瞎说,st可是allskystar大牛的大作。

不熟悉smarty语法,不赶妄评,但是从效率上说,st可是绝对的王者。
28 楼 allskystar 2008-12-16  
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译



是不是说 其他几个模板是执行缓存呢?  还是其他


sorry,没说清楚,我这么说主要是针对前面一个人说smarty在php上是做执行缓存,
才回答的,应该说,一般的模板都是做的编译缓存
smarty4j是生成字节码执行的,所以才有编译优化的可能,
现在的编译优化主要体现在条件短路算法和变量外提算法
27 楼 allskystar 2008-12-16  
spyker 写道
allskystar 写道

一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的


这里执行的结果缓存 是模板填充数据后 对执行结果的缓存么
还是 什么?

对缓存这块不是很了解
麻烦赐教


是你这个理解,不过一般的模板引擎都不会缓存执行结果,但是很多前端框架会缓存,
因为很多应用,比较博客等,更新的次数是远远少于阅读次数的,而且实时性也要求不高
就算慢个几分钟一般也没什么,多数用的是缓存执行结果的方式来加快速度
26 楼 allskystar 2008-12-16  
spyker 写道
allskystar 写道
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译

能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了


你按JSP来理解好了,hehe


编译缓存 在代码编译的时候 进行模板缓存
执行缓存 在代码调用的时候 进行模板缓存
对否?


一个是把编译形成的结果缓存,下次就不需要再次编译,典型的代表是jsp
一个是把执行的结果缓存,一定时间内就不需要再次执行,典型的代表是一些框架集成了oscache缓存的页面
第二种,会比第一种快很多倍,只是实时性就不能保证的
25 楼 allskystar 2008-12-16  
ray_linn 写道
st ... 一个连doc都没有的项目就算了


smarty4j不需要写手册,网上的smarty manual很完整了
随便在baidu或者google上搜索一下"smarty manual 中文",很多
smarty4j的源代码直接导出javadoc的话,文档也很详细的,
里面有每一个功能的用法、扩展的说明以及调用的示例
24 楼 allskystar 2008-12-16  
spyker 写道
allskystar 写道
smarty4j其实是一个编译器,将模板文档编译成了class类来执行,所以速度与直接写java代码是差不多的
对于函数的扩展,一般是继承自AbstractLineFunction或者AbstractBlockFunction
按说明实现里面的方法就行了, 对java字节码有研究的人,
可以实现AbstractFunction里面的parse方法生成字节码,这样速度会比前面一种方法快
smarty4j做的是编译缓存,而不是执行缓存,与velocity是一样的,只要源文件不变化就不会重新编译

能麻烦解释下 什么叫编译缓存 和 执行缓存么
对这个理解很模糊
谢谢了


你按JSP来理解好了,hehe
23 楼 ray_linn 2008-12-16  
st ... 一个连doc都没有的项目就算了
22 楼 biubiu 2008-12-16  
xuyao 写道
sdh5724 写道
xuyao 写道
很好,nnd,刚在velocity上大规模并发测试上碰到性能问题,marge方法效率低,正好换st试试。



不知道你做什么大型应用, 一天50亿PV的?
就我知道的, 不少大站点都是VELOCITY做的。

股票行情,我们用velocity来合成json串,全是股票信息,虽然比直接用那个JSONArray那个快很多,但是瓶颈还在这块,因为我们数据都读到内存里。如果直接拼StringBuffer会快1/3.所以想看看有啥模板可以提高一下。因为你停留在一个页面,行情列表是需要不停动态刷新的。velocity做一般网站可能可以,但是做股票行情的,还是不够理想。原来想有时间,改改velocity的源代码。她解析模板比较复杂,所以性能会有影响。因为我们是国内最大的金融门户。


1. 可能的话用StringBuilder替换StringBuffer
2. 使用Java 6

相关推荐

    浅谈Java模板引擎性能对比

    Java模板引擎性能对比 Java模板引擎是Web应用程序中一个非常重要的组件,负责将数据绑定到模板中生成最终的HTML页面。不同的Java模板引擎具有不同的性能特点,因此选择合适的模板引擎对于Web应用程序的性能非常重要...

    node-template-benchmark:不同的node.js模板引擎的性能比较

    "node-template-benchmark"是一个项目,它的目标是对比和评测不同Node.js模板引擎的性能,帮助开发者选择最适合他们的工具。 首先,让我们了解一下什么是模板引擎。模板引擎通过将静态模板与动态数据结合,生成最终...

    基于JavaScript和html的高性能模板引擎

    7. 性能测试和基准:为了确保模板引擎的高性能,开发者需要进行性能测试,对比不同模板引擎在相同场景下的表现。工具如 Benchmark.js 可以帮助进行性能基准测试。 8. 异步加载和模块化:考虑到现代Web应用的复杂性...

    方配ASP.NET模板引擎 v2.1

    当你只需要一部分功能时,大量无用的代码同样会拖累性能,基于以上考虑,方配网站模板引擎选择了另外一种模板方式。 方配网站模板引擎(FangPage Template)也简称为FPT,是一个基于ASP.NET的模板引擎(Template ...

    goTemplateBenchmark:比较不同模板引擎的性能

    goTemplateBenchmark 比较不同模板引擎的性能全功能模板引擎已移除预编译Go代码删除 Gorazor 快速模板英雄玉 特殊基准进行比较转到文本/模板(请勿将其用于HTML) StaticString-为整个模板使用一个静态字符串以具有...

    方配ASP.NET模板引擎及开发教程和案例

    当你只需要一部分功能时,大量无用的代码同样会拖累性能,基于以上考虑,方配网站模板引擎选择了另外一种模板方式。 方配网站模板引擎(FangPage Template)也简称为FPT,是一个基于ASP.NET的模板引擎(Template ...

    PHP进阶:模板引擎与MVC框架的应用与实现

    内容概要:本文详细介绍了PHP中常用的模板引擎及其在MVC框架中的应用,重点讲解了模板引擎的基本概念、核心功能、不同模板引擎的对比和具体使用示例。接着探讨了MVC框架的原理与设计,通过设计一个简单的MVC框架,...

    Python web开发几个模板系统的性能对比.docx

    文档"Python web开发几个模板系统的性能对比.docx"对比了多个流行的Python模板引擎,包括Jinja2、Cheetah、Mako、Webpy、Bottle和Tornado以及Django,通过一个简单的测试场景来评估它们的性能。测试方法是生成一个...

    Pythonweb开发=几个模板系统的性能对比.pdf

    Jinja2是一款设计简洁且功能强大的模板引擎,它受到Python语法的启发,易于学习和使用。在提供的测试中,Jinja2的模板结构清晰,使用了`{% for %}`循环和`{{ }}`表达式。Jinja2支持编译缓存和优化,这有助于提高...

    百度JS模板引擎 baiduTemplate 1.0.6 版

    总的来说,baiduTemplate作为一款轻量级的前端模板引擎,虽然没有像React或Vue那样广泛的应用,但因其简洁的语法和良好的性能,仍然在特定场景下具有较高的实用价值。1.0.6版的更新进一步增强了其稳定性和易用性,...

    python-template-benchmarking:用于比较Python模板引擎性能的工具包

    用于比较Python模板引擎性能的工具包。 安装 首先,安装 。 我建议 。 然后克隆此存储库,并使其成为工作目录。 pipx install nox git clone https://github.com/bowmanjd/python-template-benchmarking.git cd ...

    node-template-benchmarks:各种Node.js模板引擎的性能比较

    节点模板基准各种Node.js模板引擎的性能比较设置npm install npm start 比较页面将在localhost上运行注意:该项目需要io.js或Node.js(4.0或更高版本)才能运行。分析将这个小项目放在一起是为了评估在服务器上使用...

    beetl 国内流行的java模板引擎

    历史 (2009年HP 技术大会 提交的解决多环境部署问题&gt;&gt;:放在注释里的脚本) 应用范围 (全栈程序员或者前端或者美工) 功能概览 特色介绍 ...其他同类比较(freemark,jsp,angularjs,nodejs 等)

    网页模板——TMDPHP 国产优秀PHP模板引擎.zip

    TMDPHP是一款由中国开发者设计和开发的高效、轻量级的PHP模板引擎。它的出现旨在为Web开发者提供一种快速、简洁且易于维护的方式来构建动态网页。通过将HTML代码与PHP逻辑分离,TMDPHP提高了代码的可读性和可维护性...

    基于PHP的tmd_tpl国产PHP模板引擎v1.0源码.zip

    四、tmd_tpl与其他模板引擎的对比 1. Smarty:Smarty是PHP中广泛使用的模板引擎,以其强大的功能和灵活性著称。与之相比,tmd_tpl可能更加轻量级,适合小型项目或对性能有较高要求的场景。 2. Twig:Twig是Symfony...

    基于Java的源码-Beetl java模板引擎.zip

    总结来说,Beetl作为一款优秀的Java模板引擎,以其简洁的语法、丰富的功能和高性能,成为了许多Java开发者在构建Web应用时的首选。通过深入理解和熟练使用,可以极大地提高开发效率,提升项目的整体质量。下载提供的...

    Go-fasttemplate-Go简单和快速的模板引擎

    五、与其他模板引擎的比较 - `html/template`和`text/template`:这两个是Go标准库中的模板引擎,提供了安全的变量插值和条件/循环等逻辑,但解析和编译模板的过程可能较慢。 - `mustache`:Mustache是一种无逻辑的...

    基于PHP的模板引擎 xingTemplate.zip

    6. **与其他模板引擎的比较** - XingTemplate与其他PHP模板引擎,如Smarty、Twig等相比,可能在社区支持和生态系统方面稍显不足,但其轻量级和高效的特性使其在小型项目或对性能有较高要求的场景下颇具优势。 总结...

Global site tag (gtag.js) - Google Analytics