Libraries: Performance vs. Native JS

原文链接:http://codepen.io/doughensel/blog/10-libraries

假设:

当我们把代码抽取到一个可重复调用的块中时,它会阻碍代码的性能。除了使用原生DOM元素。一个JS库总是强迫浏览器查找到某块代码的引用来执行它本来应该执行的动作,就是说JS库总是以引用对象来执行动作。

为了这个性能比较,我用几种不同的代码运行了一个快速性能测试,并记录了其结果的变化。

说明:

使用的工具:

硬件:MacBook Pro : OS X

浏览器:Google Chrome,Safari,FireFox

代码/测试场景

window.onload = function(){

var counter = 0;

var timerAverage = 0;

function runTest(){

var timerEnd;

var timer = new Date();

for(var i=0,x=99999; i<=x; i++){

/**test case**/

}

timerEnd = new Date() - timer;

console.log(timerEnd + ‘ms‘);

counter++;

timerAverage 
+= timerEnd;

if(counter < 100){

runTest();

} else{

console.log(‘average time: ‘+(timerAverage/counter)+‘ms‘);

}

}

//执行测试函数

runTest();

}

快速浏览一下这个基础测试代码:

window.onload事件会在所有DOM都被加载完成后触发。

runTest()函数就是追踪运行时间和执行遍历的代码块。

测试场景1:

原生JavaScript

window.onload = function(){

var counter = 0;

var timerAverage = 0;

function runTest(){

var timerEnd;

var timer = new Date();

for(var i=0,x=99999; i<=x; i++){

/**test case**/

document.getElementById(‘id‘).style.color = ‘blue‘;

}

timerEnd = new Date() - timer;

console.log(timerEnd + ‘ms‘);

counter++;

timerAverage  += timerEnd;

if(counter < 100){

runTest();

} else{

console.log(‘average time: ‘+(timerAverage/counter)+‘ms‘);

}

}

//执行测试函数

runTest();

}

测试场景2:函数表达式编程Functional Programming

在这个测试场景中,我们会创造一个函数,根据传入的字符串id返回document.getElementById(‘id‘)得到的DOM元素。

var $ = function(elem){

return document.getElementById(elem);

};

这个函数表达式的额外好处就是程序员不是每次都输入‘getElementById‘,当他们需要得到某个元素的引用时。只需使用该函数表达式就可以。

$(‘id‘).style.color = ‘blue‘;

测试代码:

var $ = function(elem){

return document.getElementById(elem);

};

window.onload = function(){

var counter = 0;

var timerAverage = 0;

function runTest(){

var timerEnd;

var timer = new Date();

for(var i=0,x=99999; i<=x; i++){

/**test case**/

$(‘id‘).style.color = ‘blue‘;

}

timerEnd = new Date() - timer;

console.log(timerEnd + ‘ms‘);

counter++;

timerAverage  += timerEnd;

if(counter < 100){

runTest();

} else{

console.log(‘average time: ‘+(timerAverage/counter)+‘ms‘);

}

}

//执行测试函数

runTest();

}

测试场景3:面向对象的编程,Object Orientated Programming

在这个场景中,我们先创造一个可以被扩展的对象。当第一次调用下面代码时,会初始化一个新的对象,然后我们把DOM元素作为该对象的‘el‘属性的值。

(function(){

var $ = function(elem){

if(!(this instanceof $)){

return new $(elem);

}

this.el = document.getElementById(elem);

};

window.$ = $;

}) ();

这个测试场景中方法的调用很像函数表达式中方法的调用,只是多了‘.el‘。

$(‘id‘).el.style.color = ‘blue‘;

测试代码:

(function(){

var $ = function(elem){

if(!(this instanceof $)){

return new $(elem);

}

this.el = document.getElementById(elem);

};

window.$ = $;

})();

window.onload = function(){

var counter = 0;

var timerAverage = 0;

function runTest(){

var timerEnd;

var timer = new Date();

for(var i=0,x=99999; i<=x; i++){

/**test case**/

$(‘id‘).el.style.color = ‘blue‘;

}

timerEnd = new Date() - timer;

console.log(timerEnd + ‘ms‘);

counter++;

timerAverage  += timerEnd;

if(counter < 100){

runTest();

} else{

console.log(‘average time: ‘+(timerAverage/counter)+‘ms‘);

}

}

//执行测试函数

runTest();

}

测试场景四:使用jQuery。jQuery文件已被保存到本地文件,以避免从服务器下载jQuery文件时产生的任何潜在的延时。

测试代码:

window.onload = function(){

var counter = 0;

var timerAverage = 0;

function runTest(){

var timerEnd;

var timer = new Date();

for(var i=0,x=99999; i<=x; i++){

/**test case**/

$(‘#id‘).css(‘background-color‘,‘blue‘);

}

timerEnd = new Date() - timer;

console.log(timerEnd + ‘ms‘);

counter++;

timerAverage  += timerEnd;

if(counter < 100){

runTest();

} else{

console.log(‘average time: ‘+(timerAverage/counter)+‘ms‘);

}

}

//执行测试函数

runTest();

}

测试结果:

场景1:

场景2:

场景3:

场景4:

原生JS性能最好,函数表达式和面向对象的函数次之,jQuery最后。

但是,在前三个测试场景中,div都没有变为蓝色,只有jQuery让div元素变色了。原因可能是浏览器的js执行引擎和ui渲染引擎是互斥运行的,js代码在执行时是不会渲染界面的,jQuery可能在这方面做了优化。偶也不是很懂,还请大牛指导。

结论:

原生JS执行速度最快,函数表达式和面向对象编程的方法的执行效率很接近原生JS。

诚然,jQuery从一开始就注定了其结果。因为在其他的测试场景中,只有很少一块代码被使用,jQuery则是使用了整个jQuery库。除了DOM节点的选择,jQuery还使用了jQuery的css方法来更改元素样式,这都增加了很多额外的工作。

此外,我们还了解到,最短的、可执行的代码是效率最高的。尽管原生的js是一种更快的选择,但是把学会封装,以面向对象的思维来编程可以让写代码的过程更高效。

我们应该注意,当我们能自己的方式来完成一个目标时,是否应该使用一个很大的第三方代码库还完成。第三方代码库可能会让你开发核心产品时更加容易,但要注意它们可能也会影响性能。

时间: 2024-08-30 07:15:52

Libraries: Performance vs. Native JS的相关文章

JavaScript强化教程——Native.js示例汇总

本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScript强化教程 -- Native.js示例汇总 Native.js虽然强大和开放,但很多web开发者因为不熟悉原生API而难以独立完成. 这篇帖子的目的就是汇总各种写好的NJS代码,方便web开发者. 众人拾柴火焰高,有能力的开发者多多提交NJS代码,大家都会给你点赞的, Android平台 在桌面创建和删除App快捷方式 见Hello H5+里Native.js部分演示及源码. 或在这里搜索"快捷方式",h

H5+ 移动app学习之二 Native.js

Native.js技术,简称NJS,是一种将手机操作系统的原生对象转义,映射为JS对象,在JS里编写原生代码的技术.如果说Node.js把js扩展到服务器世界,那么Native.js则把js扩展到手机App的原生世界.Native.js不是一个js库,不需要下载引入到页面的script中,也不像node.js那样有单独的运行环境,Native.js的运行环境是集成在5+runtime里的. Native.js for Android封装一条通过JS语法直接调用Native Java接口通道,通过

【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解React Native与iOS之间的通信交互. 本篇主要分为两部分讲解:(关于其中讲解的OC语法等不介绍,不懂的请自行学习) 1. React Native 访问iOS 2. iOS访问React Native     一:React Native 访问iOS 1. 我们想要JS调用OC函数,就要实现一个"RCTBridgeModule"协议的Objective-C类 所以首先我们先创建一个oc新类,  

react native js 与 native 的通信与交互方式

JS 的启动过程 React Native 的 iOS 端代码是直接从 Xcode IDE 里启动的.在启动时,首先要对代码进行编译,不出意外,在编译后会弹出一个命令行窗口,这个窗口就是通过 Node.js 启动的 development server . 问题是这个命令行是怎么启动起来的呢?实际上,Xcode 在 Build Phase 的最后一个阶段对此做了配置,其实就是增加了一个 sh 脚本,让小葱的在编译会自动去执行这个脚本,打开 npm,相当于你直接手动命令行切到 react-nati

[HTML 5 Performance] Measuring used JS heap size in chrome

In this lesson we will see how to measure the used JS heap size in chrome. This can be used for various needs from performance debugging to production monitoring of apps. function measureMemory() { console.log(`${performance.memory.usedJSHeapSize / M

React Native Android 源码框架浅析(主流程及 Java 与 JS 双边通信)

[工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果.私信联系我] 1 背景 有了前面<React Native Android 从学车到补胎和成功发车经历>和<React Native Android Gradle 编译流程浅析>两篇文章的学习我们 React Native 已经能够基本接入处理一些事情了,那接下来的事情就是渐渐理解 RN 框架的一些东西,以便裁剪和对 RN 有个更深入的认识,所以本篇总结了我这段时间阅读源码

iOS Js与native相互通信

js与navive相互通信的机制 js –> native 目前,截止至iOS7,iOS原生并没有提供js直接调用native的方式,只能通过UIWebView相关的UIWebViewDelegate协议的 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 方法来

【REACT NATIVE 系列教程之五】NAVIGATOR(页面导航)的基本使用与传参

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2248.html 今天介绍一种应用开发中常用的负责页面切换及导航功能的组件:Navigator 一:Navigator 对于页面导航其实主要功能就是:每个页面都知道本身应该切换到哪个页面,并且切到的页面会记录从哪里来,如果要返回的话,知道返回到哪个页面.这一切都不需要再用逻辑管理!而且每个页面之间也可以进行参数传递,

React Native导航Navigator组件基本使用方法

最近在学React Native,了解了一个原本iOS中非常重要的导航控件的使用方法.不过在React Nativa中,这个导航控件是不会自带顶部的导航栏的,也不会自动生成返回按钮之类的,只是提供了类似的导航功能,且原理也是出栈入栈的方式,也就是说同样是有着push和pop方法的.这里不讲React Native的基础了,直接讲一讲Navigator这个组件的基本使用方法. 对于一个导航组件,最基本的就是下面几个点: 进入下一个界面 返回上一个界面 传递数据给下一个界面 返回数据给上一个界面 我