对几种流行的Javascript模板引擎的测试对比
2015-10-22 19:32
666 查看
Javascript模板引擎是数据与界面分离工作中最重要的一环,已经出现在各大型网站中:Twitter、淘宝网、新浪微博、腾讯QQ空间、腾讯微博、12306等。为了在项目中使用模板引擎,考虑从这些网站使用的引擎中选一种最好的出来。
网上有些测试结果,但尽信网不如无网,还是自己测试一下放心点,顺便也可以使用一下不同的语法,找出一种语法简便而且性能高的引擎。
先上测试结果。后面再上测试代码。
选了4家比较典型的来做测试(计算每个引擎渲染一万次的总时间),顺便可以测试一下各个浏览器的性能:
一、搜狗浏览器的结果:
二、谷歌浏览器的结果(由于浏览器引擎相同,结果也差不多):
三、360浏览器(第一种明显超标了啊啊啊。。。):
四、win10自带的Edge浏览器(处理速度明显不如谷歌啊啊啊。。。):
五、最后,臭名昭著的IE(11)来了!(全部爆表啊啊啊!!!):
从上面5个图中,结果不言自明了啊,artTemplate引擎在所有浏览器中,都是最快的,所以,选它应该没错。而且,这个引擎还支持简写,可以节省很多代码量和开发时间,可谓两全其美。
下面是测试用到的详细代码,注释比较详尽,应该可以一目了然:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JS Template Engine test</title>
<script src="../resources/js/jquery-2.1.4.js"></script>
<script src="jsrender.min.js"></script>
<script src="baiduTemplate.js"></script>
<script src="template.js"></script>
<script src="juicer.js"></script>
<link href="../resources/css/common.css" rel="stylesheet" />
<style type="text/css">
progress {width:300px; background-color:#e6e6e6 ;}
progress::-webkit-progress-bar { background: #e6e6e6; }
progress::-webkit-progress-value { background: #0064B4; }
</style>
</head>
<body>
<h1>JS模板引擎测试对比</h1>
<input type="button" value="全部测试" onClick="testAll();">
<table id="testTable">
<!-- <tr>
<th>JsRender(铁道部)</th>
<td><input type="button" value="开始测试" onClick="jsRenderTest();"></td>
<td><progress id="jsRenderChart" max="100"></progress></td>
<td><span id="jsRenderResult"></span></td>
</tr> -->
</table>
<br/>
<div>
<div id="hint"></div>
<div>渲染结果:</div>
<div><pre id="result"></pre></div>
</div>
</body>
<script id="testTrTmpl" type="text/html">
{{each list as item i}}
<tr>
<th>{{i}}、{{item.name}}({{item.mainUser}})</th>
<!-- <td><input type="button" value="开始测试" onClick="{{item.name}}Test();"></td> -->
<td><input type="button" value="测试" onClick="testList.list[{{i}}].tester();"></td>
<td><progress id="{{item.name}}Chart" max="100"></progress></td>
<td><span id="{{item.name}}Result"></span></td>
</tr>
{{/each}}
</script>
<!-- 各种模板 -->
<script id="jsRenderTmpl" type="text/x-jsrender">
第{{:index}}个,Name: {{:name}} Number: {{:number}}
</script>
<script id="baiduTemplateTmpl" type="text/html">
<%for(var i=0;i<list.length;i++){%>
第<%=list[i].index%>个,Name: <%=list[i].name%> Number: <%=list[i].number%>
<%}%>
</script>
<script id="artTemplateTmpl" type="text/html">
{{each list as item i}}
第{{item.index}}个,Name: {{item.name}} Number: {{item.number}}
{{/each}}
</script>
<script id="juicerTmpl" type="text/template">
{@each list as item}
第${item.index}个,Name: ${item.name} Number: ${item.number}
{@/each}
</script>
<script>
// 需要测试的模板引擎名字和测试函数
var testList ={
dataLength: 100, // 数据量
times: 10000, // 渲染次数
// 引擎名称
// 主要用户
// 渲染函数
list:[
{ name: "jsRender",
mainUser: "铁道部",
render: function(){
var template = $.templates("#jsRenderTmpl");
var html = template.render(data.list);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "baiduTemplate",
mainUser: "百度",
render: function(){
var html = baidu.template('baiduTemplateTmpl', data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "artTemplate",
mainUser: "腾讯",
render: function(){
var html = template('artTemplateTmpl', data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "juicer",
mainUser: "淘宝",
render: function(){
var tpl = document.getElementById('juicerTmpl').innerHTML;
var html = juicer(tpl, data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
}
]
};
//图形调整系数
var factor = testList.times/80;
var data = {
title: "测试数据",
list: []
};
//初始化测试数据
for (var i = 0; i < testList.dataLength; i ++) {
data.list.push({
index: i,
name: '<strong style="color:red">张三</strong>',
number: 100+i
});
};
$(function(){
var html = template('testTrTmpl', testList);
$("#testTable").html(html);
});
function testAll(){
for(var i = 0; i < testList.dataLength; i ++){
testList.list[i].tester();
}
}
</script>
</html>
完整代码:https://github.com/xujijun/MyJavaStudio/blob/master/src/main/webapp/jste/test.html
网上有些测试结果,但尽信网不如无网,还是自己测试一下放心点,顺便也可以使用一下不同的语法,找出一种语法简便而且性能高的引擎。
先上测试结果。后面再上测试代码。
选了4家比较典型的来做测试(计算每个引擎渲染一万次的总时间),顺便可以测试一下各个浏览器的性能:
一、搜狗浏览器的结果:
二、谷歌浏览器的结果(由于浏览器引擎相同,结果也差不多):
三、360浏览器(第一种明显超标了啊啊啊。。。):
四、win10自带的Edge浏览器(处理速度明显不如谷歌啊啊啊。。。):
五、最后,臭名昭著的IE(11)来了!(全部爆表啊啊啊!!!):
从上面5个图中,结果不言自明了啊,artTemplate引擎在所有浏览器中,都是最快的,所以,选它应该没错。而且,这个引擎还支持简写,可以节省很多代码量和开发时间,可谓两全其美。
下面是测试用到的详细代码,注释比较详尽,应该可以一目了然:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JS Template Engine test</title>
<script src="../resources/js/jquery-2.1.4.js"></script>
<script src="jsrender.min.js"></script>
<script src="baiduTemplate.js"></script>
<script src="template.js"></script>
<script src="juicer.js"></script>
<link href="../resources/css/common.css" rel="stylesheet" />
<style type="text/css">
progress {width:300px; background-color:#e6e6e6 ;}
progress::-webkit-progress-bar { background: #e6e6e6; }
progress::-webkit-progress-value { background: #0064B4; }
</style>
</head>
<body>
<h1>JS模板引擎测试对比</h1>
<input type="button" value="全部测试" onClick="testAll();">
<table id="testTable">
<!-- <tr>
<th>JsRender(铁道部)</th>
<td><input type="button" value="开始测试" onClick="jsRenderTest();"></td>
<td><progress id="jsRenderChart" max="100"></progress></td>
<td><span id="jsRenderResult"></span></td>
</tr> -->
</table>
<br/>
<div>
<div id="hint"></div>
<div>渲染结果:</div>
<div><pre id="result"></pre></div>
</div>
</body>
<script id="testTrTmpl" type="text/html">
{{each list as item i}}
<tr>
<th>{{i}}、{{item.name}}({{item.mainUser}})</th>
<!-- <td><input type="button" value="开始测试" onClick="{{item.name}}Test();"></td> -->
<td><input type="button" value="测试" onClick="testList.list[{{i}}].tester();"></td>
<td><progress id="{{item.name}}Chart" max="100"></progress></td>
<td><span id="{{item.name}}Result"></span></td>
</tr>
{{/each}}
</script>
<!-- 各种模板 -->
<script id="jsRenderTmpl" type="text/x-jsrender">
第{{:index}}个,Name: {{:name}} Number: {{:number}}
</script>
<script id="baiduTemplateTmpl" type="text/html">
<%for(var i=0;i<list.length;i++){%>
第<%=list[i].index%>个,Name: <%=list[i].name%> Number: <%=list[i].number%>
<%}%>
</script>
<script id="artTemplateTmpl" type="text/html">
{{each list as item i}}
第{{item.index}}个,Name: {{item.name}} Number: {{item.number}}
{{/each}}
</script>
<script id="juicerTmpl" type="text/template">
{@each list as item}
第${item.index}个,Name: ${item.name} Number: ${item.number}
{@/each}
</script>
<script>
// 需要测试的模板引擎名字和测试函数
var testList ={
dataLength: 100, // 数据量
times: 10000, // 渲染次数
// 引擎名称
// 主要用户
// 渲染函数
list:[
{ name: "jsRender",
mainUser: "铁道部",
render: function(){
var template = $.templates("#jsRenderTmpl");
var html = template.render(data.list);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "baiduTemplate",
mainUser: "百度",
render: function(){
var html = baidu.template('baiduTemplateTmpl', data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "artTemplate",
mainUser: "腾讯",
render: function(){
var html = template('artTemplateTmpl', data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
},
{ name: "juicer",
mainUser: "淘宝",
render: function(){
var tpl = document.getElementById('juicerTmpl').innerHTML;
var html = juicer(tpl, data);
$("#result").html(html);
},
tester: function(){
var startTime = new Date();
for(i=0;i<testList.times;i++){
this.render();
}
var costTime = new Date() - startTime;
$("#"+this.name+"Result").html(costTime + "ms");
$("#"+this.name+"Chart").val(costTime/factor);
}
}
]
};
//图形调整系数
var factor = testList.times/80;
var data = {
title: "测试数据",
list: []
};
//初始化测试数据
for (var i = 0; i < testList.dataLength; i ++) {
data.list.push({
index: i,
name: '<strong style="color:red">张三</strong>',
number: 100+i
});
};
$(function(){
var html = template('testTrTmpl', testList);
$("#testTable").html(html);
});
function testAll(){
for(var i = 0; i < testList.dataLength; i ++){
testList.list[i].tester();
}
}
</script>
</html>
完整代码:https://github.com/xujijun/MyJavaStudio/blob/master/src/main/webapp/jste/test.html
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- myTemplate模板引擎
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- IE8开发人员工具教程(二)
- 在flex中执行一个javascript方法的简单方式
- Flex结合JavaScript读取本地路径的方法
- PowerShell中执行Javascript的方法示例
- javascript asp教程第六课-- response方法