引擎渲染速度测试--我js代码写得少你不要骗我
上一张图,很多人都看过的

地址:http://aui.github.io/artTemplate/test/test-speed.html
这个地址是在看artTemplate的时候看到的,很早都看过但是没去研究为什么artTemplate为什么那么快,其他的为什么那么慢。最近看underscore的源码,先看了template部分,再想起这张图,我就不服了。凭神马underscore那么慢,基本上就是倒数第二的成绩。我代码写得少,上面那个图是在骗我吗!!!
于是看了下作者的测试代码,也在作者那个页面跑了好几次,结果几乎都差不多,难道事实就是这样的!!!!underscore的渲染速度是垫底的成绩。于是看了看作者的测试代码,其他的不管,只看underscore的。
name: 'underscoreTemplate',
tester: function () {
var source = document.getElementById('underscoreTemplate').innerHTML;
var fn = _.template(source);
for (var i = ; i < number; i ++) {
fn(data);
}
}
页面上还有一些变量
// 数据量
var length = ;
// 渲染次数
var number = ; var data = {
list: []
}; for (var i = ; i < length; i ++) {
data.list.push({
index: i,
user: '<strong style="color:red">糖饼</strong>',
site: 'http://www.planeart.cn',
weibo: 'http://weibo.com/planeart',
QQweibo: 'http://t.qq.com/tangbin'
});
};
模板代码
<!-- underscore 的模板 -->
<script id="underscoreTemplate" type="text/tmpl">
<ul>
<% for (var i = , l = list.length; i < l; i ++) { %>
<li>用户: <%=list[i].user%>/ 网站:<%=list[i].site%></li>
<% } %>
</ul>
</script>
以上代码貌似都没什么看头,都是正常的使用代码,但是我想说underscore可以这样用var fn = _.template(source,{variable:list});您也可以在 variable 设置里指定一个变量。名外部指定变量名内部就不会使用with,问题就出在这里,测试代码没这样用!!!!
其实underscore内部代码稍加改动就可以去掉with。于是我把代码稍加改动,使用方式稍加改动,以下是改后的代码。 我使用的underscore的版本是1.7.0
// JavaScript micro-templating, similar to John Resig's implementation.
// Underscore templating handles arbitrary delimiters, preserves whitespace,
// and correctly escapes quotes within interpolated code.
// NB: `oldSettings` only exists for backwards compatibility.
// template本身是一个方法,可以提供三个参数,第一个为模板文本,第二个为对应模板数据,第三个为基本配置信息
//模板函数可以使用 <%= … %>插入变量, 也可以用<% … %>执行任意的 JavaScript 代码、进行HTML转义,使用<%- … %>
_.template = function(text, settings, oldSettings) {
if (!settings && oldSettings) settings = oldSettings;
settings = _.defaults({}, settings, _.templateSettings); // Combine delimiters into one regular expression via alternation.
var matcher = RegExp([
(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source
].join('|') + '|$', 'g'); // Compile the template source, escaping string literals appropriately.
var index = 0;
var source = "__p+='";
//没有设置settings.variable 默认使用对象+. 来取值
var settingObj = !!settings.variable ? '' : '_obj.';
//几个分组
text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
source += text.slice(index, offset).replace(escaper, escapeChar);
index = offset + match.length; if (escape) {
//编码
//_obj.XXX
source += "'+\n((__t=(" + settingObj + escape.trim() + "))==null?'':_.escape(__t))+\n'";
} else if (interpolate) {
//取值
//_obj.XXX
source += "'+\n((__t=(" + settingObj + interpolate.trim() + "))==null?'':__t)+\n'";
} else if (evaluate) {
//任意的Javascript
source += "';\n" + evaluate + "\n__p+='";
}
// Adobe VMs need the match returned to produce the correct offest.
return match;
});
source += "';\n"; // If a variable is not specified, place data values in local scope.
// 据说使用with 性能不咋地,可以使用变量
// with可能会影响性能,并造成难以发现的错误
//if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
//去掉使用with
if (!settings.variable) source = ' var _obj=obj||{};\n' + source + ' \n';
source = "var __t,__p='',__j=Array.prototype.join," +
"print=function(){__p+=__j.call(arguments,'');};\n" +
source + 'return __p;\n'; try {
var render = new Function(settings.variable || 'obj', '_', source);
} catch (e) {
e.source = source;
throw e;
} var template = function(data) {
return render.call(this, data, _);
}; // Provide the compiled source as a convenience for precompilation.
var argument = settings.variable || 'obj';
template.source = 'function(' + argument + '){\n' + source + '}'; return template;
};
改动后的代码,加上使用也改动下,指定variable,测试结构大变,修改后测试结构如下图。不是underscore慢,是没用对。不信自己跑一跑 我提供代码。下载地址:test.zip 里面有一个test-speed.html 跑一下就知道结果了。
这是在chrome38中的测试结果

这是在firefox 34中的测试效果

模板引擎基本上都是模板先预编译 fn = _.template(source),然后调用之前得到的函数fn(data)进行最后的渲染。所以模板引擎的速度应该是模板预编编译时间和数据渲染时间之和才对,但是这里只测试了一个渲染数据的时间,明显不够全面。
我也测试了一下编译速度,发现最快的Handlebars,而artTemplate速度基本上处于垫底水平,不信自己测试。最后得出:模板预编译时间加上渲染的速度其实artTemplate并不是想象中那么快,其实和underscore差不多。不信自己测试下。
引擎渲染速度测试--我js代码写得少你不要骗我的更多相关文章
- 如何让你的JS代码写的更漂亮
感觉这篇文章总结的js的规范写法不错,拿来收藏.转自:https://mp.weixin.qq.com/s/AtR94IL9BW9EXOTnKOilmA 1. 按强类型风格写代码 JS是弱类型的,但是 ...
- 为什么要把js代码写到<!--//-->中
是为了兼容,不支持js的浏览器会把其中的内容当做html注释.
- 用最少的JS代码写出贪吃蛇游戏---迷你版
游戏进行页面展示 GAME OVER 页面展示 代码如下: <!doctype html> <html> <body> <canvas id=&q ...
- 试着讲清楚:js代码运行机制
一. js运行机制 js执行引擎 经常看文章的说到js是带线程的,其实这个说法非常的模糊,准确的是js执行引擎是单线程的,js执行引擎就是js代码的执行器,有了这个概念就可以下来说说js是如何运行的了 ...
- 轮播图--JS手写
轮播图基本每个网站都会有,也有很多的JQuery插件可以用,这里是用JS代码写的. @{ Layout = null; } <!DOCTYPE html> <html> < ...
- 原始的js代码和jquery对比
Even a task as simple as this can be complicated without jQuery at our disposal. In plain JavaScript ...
- 页面怎么引用外部css+js代码
外部css样式:把css样式写到一个文件内,方便使用,减少冗余. 如果使用的是外部css样式,页面怎么引用: 使用 <link rel="stylesheet" type=& ...
- 程序员面试京东前端,现场JavaScript代码写出魔方特效
程序员面试京东前端,现场JS代码写出魔方特效,成功搞定20K月薪 今天小编我逛论坛,看到了一位程序员小伙子,因为是有了两年工作经验,然后去京东面试前端岗,一面二面轻松就过了,到了技术面这一块,小伙干脆 ...
- 浏览器渲染引擎,提高css渲染速度。
一.渲染引擎渲染引擎的职责是……渲染,也就是把请求的内容显示到浏览器屏幕上.默认情况下渲染引擎可以显示HTML,XML文档以及图片. 通过插件(浏览器扩展)它可以显示其它类型文档. 二.各种渲染引擎我 ...
随机推荐
- 一致性Hash算法及使用场景
一.问题产生背景 在使用分布式对数据进行存储时,经常会碰到需要新增节点来满足业务快速增长的需求.然而在新增节点时,如果处理不善会导致所有的数据重新分片,这对于某些系统来说可能是灾难性的. 那 ...
- 【C语言】02-基本数据类型
跟其他语言一样,C语言中用变量来存储计算过程使用的值,任何变量都必须先定义类型再使用.为什么一定要先定义呢?因为变量的类型决定了变量占用的存储空间,所以定义变量类型,就是为了给该变量分配适当的存储空间 ...
- 微软 Visual Studio 2012 Update4正式版下载
今天微软正式发行Visual Studio 2013全新的开发工具,但是仍然没有忘记对旧版开发工具的软件升级服务.同样也是在VS2013发布这一天,微软也为VS 2012提供了正式版的Visual S ...
- GridView不換行
在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便会出问题,即GridView会显示不全. 解决办法,可以把ScrollVIew给删除 ...
- C# String 前面不足位数补零的方法 PadLeft
PadLeft(int totalWidth, char paddingChar) //在字符串左边用 paddingChar 补足 totalWidth 长度PadLeft(int totalWid ...
- android adb:电池与电量
手机每个硬件的耗电量是不一样的!比如屏幕就是耗电大户!其它一些元件则耗电量非常小! 使用android dumpsys工具可以获取电池以及电量消耗信息! dumpsys工具:battery.batte ...
- 判断对象是不是Vector
判断对象是不是数组可以用 var arr:Array = []; trace(arr is Array);//true var vec:Vector.<String> = new Vect ...
- Eclipse查看历史代码
选中要查看的文件(.class等) 右击->Team->Show Local History
- 粵語/廣東話/Cantonese 資料/Material
一.粵語歌詞網 1.海闊天空(粵語) 歌詞 今天我 寒夜裡看雪飄過 gam1 tin1 ngo5 hon4 je6 leoi5 hon3 syut3 piu1 gwo3 懷著冷卻了的心窩漂遠方 waa ...
- 376. Wiggle Subsequence
A sequence of numbers is called a wiggle sequence if the differences between successive numbers stri ...