擦,今天学用benchmark测试我写的模板引擎,逆天啊
发布于 8 年前 作者 2881099 5567 次浏览 来自 分享

2222222.png

jade 和 ejs没有使用编译执行测试的 handlebars 编译后测试的 我写的bmw.js并没有编译这个概念,首次使用可以理解成编译吧

过年这段时间确实无聊,没啥事就一直在搞这玩意

源代码:https://github.com/2881099/bmw.js 欢迎拍砖

13 回复

楼主,benchmark是啥?给个官网链接看看喃

https://github.com/coordcn/sml

顺便帮我也测下,看看速度有没有你的快。。。

@coordcn 怎么测呢,没有npm 安装命令吗?项目文件多了,不会使用

@2881099

要手动编译的,cls目录里c.js负责编译(sml => js), tt.js负责渲染(js + data => html)。

var sml = require('../lib/sml');
var fs = require('fs');

var filename = 'test.sml';
var str = fs.readFileSync(filename, 'utf-8');
var s = new sml(str, filename);
s.parse();
var out = s.compile();
fs.writeFileSync('test.js', out, 'utf-8');

var test = require('test.js');
var data = {title:"title"};
var html = test.render(data);

类Jade语法,支持模板继承,速度大概是ejs的10倍左右,我不清楚你这么大差距的数据是怎么做出来,你的代码我也大致看了,并没有什么黑魔法。

我大概猜出是什么原因了,可能你的测试并没有考虑escape,如果带escape,差距不会这么大的。

@coordcn 循环怎么写,你上面的readme不详细

对应的数据是 db = { list:[{index : 1, user : ‘xxx’, site : ‘yyy’}, {index : 1, user : ‘xxx’, site : ‘yyy’}, {index : 1, user : ‘xxx’, site : ‘yyy’} …] }

ul 这里写 for li {#item.index}. 用户: {#item.user}/ 网站:{#item.site} /li 这里是 for 结束 /ul

@coordcn 是的,我并没有转换这些,我会在输出不安全的数据时手工转换

@2881099

循环就是js代码,其实模板优化到极限性能都差不多,你跟doT和jst比就行了,sml性能跟他们差不多,关键还是易用。这个是半成品,现在不搞js了,我用lua了。有时间用lua也实现一个,语法统一,可以编译不同语言的。

sml最大的特点是继承的实现,模板的继承就是利用javascript原型继承实现的,可以无限继承。

这个是 @fengmk2 测试各种模板性能的帖子。 https://cnodejs.org/topic/4f16442ccae1f4aa27001109

@coordcn 我的也实现的无限继承,你可以看github上的readme,我刚用jade语法测试sml,提示运行错误 找不到 ./lib/debug,测不了

@coordcn 和doT对比了下,慢了一点点,他也没有escape 首页渲染时间比doT快了一倍,相当于是编译时间吧

灵活度的话我觉得doT差一些,可能我还没具体了解,我的能适应任何js表达式,还有我受不了他的语法

@coordcn 他快的原因是因为传递了it整个对象进渲染函数中

比如 it 内容是 { list:[], title :‘xxx’ }

doT在模板中就会这样使用 {{=it.title}},因为他的渲染函数是 function(it)

我为了模板中使用更方便,直接 {#title} 就行了, 因此我在渲染前分会先把 it 对象的成员分析出来,再构造相应的参数 function(list, title)

整个对比的差距就在 for (var key in it) 上了,doT没有这个步骤

@2881099 我也用了it,优化到极限这点性能也是要压榨的,自己做模板,基本上自己玩,别人一般不用的。主要是了解如何优化。

@coordcn 同样的代码放到express.use("/", function(req, res) {}); 里面测试不知道为啥结果差了近10倍,可能受http或者其他模块影响吧

@2881099

这个跟加escape道理是一样的,性能差距被其他计算拉平了。

nodejs的stream实现并不是很高效,net和http自然性能一般,你模板即便再快,原生模块扯了后腿,平均下来就不好看了。

你可以看响马的测试 http://cnodejs.org/topic/5672c03fcd926feb0c0c8ebc

ndoejs和fibjs,go的差距可不是一点两点,尤其在高并发的状态下,差距更大。

我用lua和libuv实现的也比nodejs性能好,跟fibjs一样是用同步代码写异步程序,没有回调,没有promise,没有generator/yield,没有async/await,直接同步代码走起。

https://github.com/coordcn/LuaIO

回到顶部