tiny html模板引擎,剖析 “‘最好的模板引擎’Beetl剖析及与Tiny模板引擎对比”...

http://blog.csdn.net/cndes/art ... 88771这有一篇文章,说是剖析beetl模板引擎,并与同为国内的tiny模板引擎作对比(如下简称“剖析beetl”),其剖析过程公正,但结论却不正确(文中暗示的结论,而不是文章最后一段总结),

每次在百度里搜索beetl,这篇文章总会出现,也有打算使用beetl的人会将信将疑的把这文章发给我看以求证里面剖析是否正确。在beetl社区解释都比较费口舌,所以决定写一篇文章说明一下我观点。

那篇剖析文章太长,惟一上代码的地方就是beetl的 for循环实现源码,做者也拿出tiny 模板引擎的循环实现源码,来证实“tiny短小精悍,功能丰富,然而那个做者弄错了。

做者不清楚beetl的循环有一个重要功能,安全输出,代码以下(79行)java

// java 实现

if (collection == null)

{

if (!this.hasSafe)

{

BeetlException ex = new BeetlException(BeetlException.NULL);

ex.pushToken(exp.token);

throw ex;

}

else

{

it = new IteratorStatus(Collections.EMPTY_LIST);

}

}

也就是说在安全模式下,若是结果集为空,则不会进入循环体,也不会抛错。虽然多了6行代码,却多了一个安全输出功能,beetl开发者只要用安全输出符号! 就能够了,以下beetl代码

//beetl 代码

var users = null;

for(u in users!){

}

再回头看看那beetl源码,若是集合为null,且没有安全输出,则会抛出一个BeetlException异常,说明是空值异常,而且 ex.pushToken(exp.token); 这个语句经过token指明了是哪一个符号出错,

beetl的错误提示很是友好,这是众所周知的,也在于它的代码里到处有主动的异常的处理,而不是被动抛出异常。

而后咱们再看104行代码

ctx.vars[varIndex + 1] = it; 这句代码是将集合赋值到beetl变量表里,一样还要114行的赋值 ctx.vars[varIndex] = it.next(); 这种将值赋值给数组元素的方式,相似低级语言的指针,带来的好处就是经过数组索引访问变量,速度很是快,这在个人一篇博客里说明过这个问题http://my.oschina.net/xiandafu/blog/293167,这篇博客说明,经过数组索引访问变量,比传统模板引擎使用的Map经过变量名来存取快100倍。

固然实现这个为变量分配索引(相似c语言的指针),用了大量的语法解析代码,这也是beetl自己较大的缘由(然而远小于freemarker和veclotiy),那篇剖析文章显然没有看到beetl的这个特性,而草率认为beetl体积过大,“剖析beetl”也没有看到beetl 对for循环的优化,由于for循环总要对跳出语句进行检查(break;return;continue),所以,代码看起来以下(115行)数组

forPart.execute(ctx);

switch (ctx.gotoFlag)

{

case IGoto.NORMAL:

break;

case IGoto.CONTINUE:

ctx.gotoFlag = IGoto.NORMAL;

continue;

case IGoto.RETURN:

return;

case IGoto.BREAK:

ctx.gotoFlag = IGoto.NORMAL;

return;

}

但beetl也对于这种跳出作了优化,由于在语法解析阶段,就能分析出循环是否含有跳出语句,若是没有跳出语句,则没必要执行跳出检测,代码在139行安全

// java实现

while (it.hasNext())

{

ctx.vars[varIndex] = it.next();

forPart.execute(ctx);

}

代码在109行先检测是否含有跳出语句if (this.hasGoto),若是没有,则直接执行如上循环

最后,让咱们再来看看beetl循环另一个特性,elsefor 语法,若是没有进入循环体,则进入eslefor循环,以下beetl代码性能

// beetl代码

var users = null;

for(u in users!){

}elsefor{

print("no value");

}

实现这个特性,beetl仍然用了"几句冗长代码"实现,代码以下:

// java实现

if (!it.hasData())

{

if (elseforPart != null)

elseforPart.execute(ctx);

}

}

经过it.hasData 判断是否进入循环体,若是没有,但模板具备elsefor,则执行elsefor部分逻辑。

到此为止,for循环实现的主体总共80余行代码自我剖析完毕,beetl里面有安全输出,有eslefor 特点语法,有跳出检测以优化性能,还有高性能的变量管理,还有无处不在异常处理,做为beetl做者,我并不以为代码还能精简到什么程度,若是你反观"剖析beetl文章"里提到的tiny template的循环实现源码,你会问,安全输出在哪里?若是没有进入循环体,我是否也有elsefor帮忙处理?还有,怎么没看到异常处理.以及跳出检测和跳出优化?tiny template 的变量管理方式仍是map方式而不是速度更多的数组方式?

相信你已经对“剖析beetl”这文章是否靠谱已经有了正确认识。同时市场也是检验真理的标准,我做为独立开发者(也有爱好者捐献了beetl扩展),不买粉,不拉票,不巡讲,没有企业推手,经过5年的开发和维护,beetl事实上已经成为国内最为流行的java模板引擎之一,能代替长期垄断的国外freemaker和velcoity。,这些市场成果也证实了“剖析beetl"是多么的不靠谱和结论草率!优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值