console.time 简单分析javascript动态添加Dom节点的性能

Bullshit

本来想每天都更新下博客的,但是最近要考试,还有就是自己还是停留在暗自窃喜中吧(这种想法要改变)。其实最近总在想,自己要怎么去管理自己的数据,每天的生活都是对自己的数据的增删查改。昨天把自己的电脑重装了,确实很多软件的存放要改地方了,之前不知道怎么去管理软件安装,所以放得乱七八糟的。说好一大堆废话之后,我最后再说一遍,管好自己的时间、数据真的比你学习东西重要。

Method

本文代码约定

  • 1 el: 指的是增加直接点的DOM节点
  • 2 totalNum: 为100000(值越大越能体现差距)指的是循环创建的DOM节点
  • 3 for(var i=0;i<totalNum;i++){}: 我们用for来表示就好了,简写代码

如果叫你用javascript动态增加DOM节点,你有哪几种思路呢?

1 .使用innerHTML和字符串拼接
console.time("time1");
var str = "";
for{ 
str += "<div>123<div>"; 
}
el.innerHTML = str;
console.timeEnd("time1");
2 .使用innerHTML和数组
console.time("time2");
var arr = [];
for{
arr.push("<div>123<div>");
}
el.innerHTML = arr.join("");
console.timeEnd("time2");
3 .使用DOM API
console.time("time3");
var str = "";
for{
var div = document.createElement("div");
div.textContent = "123";
el.appendChild(div);
}
console.timeEnd("time3");

result

在这里有必要知道console.time命令的作用,请看链接console.time(label)。我简单介绍下吧,就是在console.time函数中传入一个参数,这个参数就是一个标记,当chrome运行到这里就开始计时,那什么时候结束计时呢,这个就有关另外一个函数console.timeEnd,参数就是刚才那个标记。这样子我们就知道中间那段javascript代码究竟跑了多久了,记住它是以毫秒为单位的。

那好我们现在猜测下究竟哪段代码跑的时间最短呢?

不卖关子了,时间长短逐渐上升分别是:time2<time3<time1(我只是在chrome上面测试,可能在其他浏览器不一样)

Summary

为什么会出现上面的情况呢?

  • 一 首先我们要知道我们用的chrome是webkit内核,他们对操作DOM节点已经优化得很好了,所以DOM API与innerHTML两着在性能上是没多大区别的(引用于《高性能javascript》)
  • 二 就是既然DOM API与innerHTML性能上没多大区别的话,为什么time3<time1呢?这个就是有关字符串连接的性能问题了。
    就上面的例子 str += "<div>123</div>"那js解析器如何解析呢?
    1 新建一个临时字符串
    2 把str和后面的字符串拼接赋给新的临时字符串
    3 销毁原始字符串并赋值给str
    这样子的效率是低下的。
  • 三 而作为第一个数组原生的方法为什么会最快呢?。这个因为javascript的原生部分是在你写代码的时候它们已经在浏览器中了,它们是用底层的语言写的,比如C++,这个就意味着这些方法会被编译成机器码(《高性能javascript》)

console.time 简单分析javascript动态添加Dom节点的性能

时间: 2024-10-03 18:44:15

console.time 简单分析javascript动态添加Dom节点的性能的相关文章

【转】console.time 简单分析javascript动态添加Dom节点的性能

本文代码约定 1 el: 指的是增加直接点的DOM节点 2 totalNum: 为100000(值越大越能体现差距)指的是循环创建的DOM节点 3 for(var i=0;i<totalNum;i++){}: 我们用for来表示就好了,简写代码 如果叫你用javascript动态增加DOM节点,你有哪几种思路呢? 1 .使用innerHTML和字符串拼接 console.time("time1"); var str = ""; for{ str += &quo

javascript动态添加html节点

之前一直没怎么接触需要动态添加和删除html节点的项目,这次项目中用到了,也学习了. 在一个<table id="tab">标签中添加一个<tr id="tr">标签,<tr>标签里面包含4个<td>标签 function insertTr() { tr = document.createElement("tr"); html = "<td></td>"+

jquery动态添加DOM节点

1.append()方法:向每个匹配的元素内部添加元素 appendTo()方法:将所有匹配的元素追加的指定的元素中 <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> <title>jquery选择器</title> </head> <body> <ul>

【原生js】js动态添加dom,如何绑定事件

首先要明白浏览器在加载页面的时候是按顺序来加载的,这样以来就很清楚了,js动态添加dom以后,这些dom并没有绑定事件,这个时候最简单的一个办法就是:将绑定事件的方法封装到一个函数A中,在动态添加完dom以后立即执行一次函数A即可. 需要注意的是,在你可能同事需要添加许多的dom,不要添加一个就执行一次函数A,这样会增加浏览器的负载,你需要在所有dom添加完以后在执行函数A,例如你用一个for循环遍历dom组合并拼接成一个字符串,然后添加到某个父级dom里面,这个时候你需要在循环外添加一次就可以

javascript动态添加form表单元素

2014年11月7日 17:10:40 之前写过几篇类似的文章,现在看来比较初级,弄一个高级的简单的 情景: 后台要上传游戏截图,截图数量不确定,因此使用动态添加input节点的方法去实现这个效果 主要用到的函数有: document.getElementById(); objNode.parentNode; objNode.cloneNode(); objNode.removeAtrribute(); objNode.innerHTML(); objNode.appendChild(); ht

用Javascript动态添加删除HTML元素实例 (转载)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>用javascript动态添加删除html元素</title> <script type="text/jav

动态操作DOM节点js实现

    近日再次翻看<javascript面向对象编程指南>这本书,读到浏览器环境一章,渐渐明白了js作为脚本语言,需要依托宿主环境来实现功能,从浏览器角度考虑,就是对浏览器的BOM和DOM的操作.DOM操作又可分为:访问.修改.删除.新建.每种操作都有独特的方法和属性.下面取dom节点的访问.新建和删除的功能实例来讲解(参考文章).     <INPUT LEFT: 392px; POSITION: absolute; TOP: 128px" type="butto

【实践】js 如何实现动态添加文本节点

对于我这个js 小白来说 今天鼓起勇气做起了邮箱认证这个特效 但是这次不是想说如何实现这这个特效而是想记录一下特效当中的某个部分 那就是向元素节点动态添加文本节点 百度了一下动态添加文本节点的方式 是使用document.createNodeChild("要想添加的内容");   这个方法 它的使用方式是: var correct = document.createTextNode("输入正确"); var error = document.createTextNo

一文带你彻底明白如何实现动态添加子节点及修改子节点属性

? 终于看完了官方的教程,开始用 Cocos Creator 做第一个游戏——<消灭病毒-重力版>(PS:等做完之后会出一个完整的教程,敬请期待┗( ▔, ▔ )┛!),可是第一步就遇到了坑,本来想动态的通过预制件来添加病毒节点,并修改病毒的血量,可是添加节点之后无论如何都不能对节点的属性进行修改,查了半天资料原来是没有获取子节点的组件,白白浪费了两个小时,这就是自学的弊端吧,有一个好的老师真的是太重要了!为了让大家少走弯路,今天写一个 Demo 来教大家如何实现动态添加子节点及修改子节点属性