电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

JS性能優化實現方法及優點進行

瀏覽:95日期:2024-04-22 16:08:43

最近剛閱讀完《高性能javascript》,想談談對js性能優化的看法。理解有些不同,可能還需要各位多多提醒。

話不多說,提到javascript難免會聯想到文檔對象模型(DOM),它作用于XML和HTML文檔的程序接口(API),位于瀏覽器中,主要用來與HTML文檔打交道。同樣也用于Web程序中獲取XML文檔,并使用DOM API來訪問文檔中的數據。盡管DOM是個與語言無關的API,它在瀏覽器中的接口卻是用javascript實現的。客戶端腳本編程大多數時候是在和底層文檔(underlying document) 打交道,DOM就成為現在javascript編程中的重要部分。

瀏覽器通常會把DOM和js獨立實現。比如在IE中,javascript的實現名為Jscript,位于jscript.dll文件中;DOM的實現則存在另一個庫中,名為mshtml.dll(內部稱為Trident)。這個分離允許的其他技術和語言,比如VBScript,能共享使用DOM以及Trident提供的渲染函數。Safari中的DOM和渲染使用的Webkit中的WebCode實現,javascript部分是由獨立的javascriptCode引擎(最新版本的名字為SquirrelFish)來實現。Google Chrome同樣使用WebKit中的WebCore庫來渲染頁面,但javascript引擎是他們自己研發的,名為V8。Firefox的javascript引擎名為SpiderMonkey(最新版的名字為TraceMonkey),與名為Gecko的渲染引擎相互獨立。

把DOM和javascript(這里指ECMAScript,JavaScript使用的ECMAScript版本為ECMAScript-262)各自想象一個島嶼,它們之間用收費橋梁連接。ECMAScript每次訪問DOM,都需要途經這座橋,并交納“過橋費”。訪問DOM的次數越多,費用越高。所以想辦法減少過橋次數就可以減少費用。

一、超載運輸

上面提到“過橋費”很貴啊,那么我們盡量使需要多次去訪問DOM的時候全部整合到一次。比如最簡單的例子:

function innerHTMLLoop(){ for(var count = 0;count < 15000 ;count++){ document.getElementById(’here’).innerHTML +=’a’; } }

這個函數循環修改頁面元素的內容。這段代碼存在循環迭代,該元素都被訪問兩次,一次是讀取innerHTML屬性值,另一次是重寫它。(意味著每次循環都必須付“過橋費”)。

為了減少費用,我們采取一種更高效的方法,例:

function innerHTMLLoop2(){ var content = ’ ’; for(var count = 0;count < 15000 ;count++){ content +=’a’; } document.getElementById(’here’).innerHTML +=content;}

這樣只需要付一次“過橋費”,就可以完成相同的功能。運行速度在不同的瀏覽器中都有大幅度的提升,例如IE6中,使用innerHTMLLoop2()比使用innerHTMLLoop()快155倍。(所以現實當中好多大卡車超載也是為了省這個費用,一次性多賺點。不過還是量力而行。程序也是一樣,均衡存乎萬物之間。)

二、觸手可及

盡管使用優化過的javascript引擎的新型瀏覽器,對于對象成員引用也存在一些性能問題。對象在原型鏈中存在的未知越深,找到它也就越慢,例如不太常見的寫法:window.location.href。每次遇到點操作符,嵌套成員會導致Javascipt引擎搜索所有對象成員。對象成員嵌套得越深,讀取速度就會越慢。執行location.href總是比window.location.href要快,后者也比window.location.href.toString()要快。如果這些屬性不是對象的實例屬性,那么成員解析還需要搜索原型鏈,這會花更多的時間。

由于類似的性能問題都是與對象成員有關,因此應該盡可能避免使用它們。更準確地說,應當注意,只在必要時使用對象成員。例如,在同一個函數中沒有必要多次讀取同一個對象成員。例:

function hasEitherClass(element,className1,className2){ return element.className == className1 || element.className == className2; }

以上的代碼,element.className讀取了2次。意味著在該函數語句中2次成員查找都是通過讀取屬性值,那么有必要子啊第一次查找到值后就將其存儲在局部變量中,因為局部變量的讀取速度要快很多。例:

function hasEitherClass(element,className1,className2){ var currentClassName = element.className; return currentClassName == className1 || currentClassName == className2; }

上面element.className 賦值在currentClassName局部變量,避免了多次查找帶來的性能開銷。(多次需要全局對象成員,那就賦值在最容易拿到的地方,這樣可以減少去搜索和查找)

總結

雖然我還有很多要講,但是太多太多的方式可以進行性能優化,以后有更好的再補充。不過優化就是跟人找方法用最小的力量去做最大的事情一樣,說俗點就是“懶”,我們讓程序也懶。

下面是一些關于客戶端JS性能的一些優化的小技巧:

1.[頂]關于JS的循環,循環是一種常用的流程控制。JS提供了三種循環:for(;;)、while()、for(in)。在這三種循環中 for(in)的效率最差,因為它需要查詢Hash鍵,因此應盡量少用for(in)循環,for(;;)、while()循環的性能基本持平。當然,推 薦使用for循環,如果循環變量遞增或遞減,不要單獨對循環變量賦值,而應該使用嵌套的++或--運算符。

2.如果需要遍歷數組,應該先緩存數組長度,將數組長度放入局部變量中,避免多次查詢數組長度。

3.局部變量的訪問速度要比全局變量的訪問速度更快,因為全局變量其實是window對象的成員,而局部變量是放在函數的棧里的。

4.盡量少使用eval,每次使用eval需要消耗大量時間,這時候使用JS所支持的閉包可以實現函數模板。

5.盡量避免對象的嵌套查詢,對于obj1.obj2.obj3.obj4這個語句,需要進行至少3次查詢操作,先檢查obj1中是否包含 obj2,再檢查obj2中是否包含obj3,然后檢查obj3中是否包含obj4...這不是一個好策略。應該盡量利用局部變量,將obj4以局部變量 保存,從而避免嵌套查詢。

6.使運算符時,盡量使用+=,-=、*=、=等運算符號,而不是直接進行賦值運算。

7.[頂]當需要將數字轉換成字符時,采用如下方式:'' + 1。從性能上來看,將數字轉換成字符時,有如下公式:('' +) > String() > .toString() > new String()。String()屬于內部函數,所以速度很快。而.toString()要查詢原型中的函數,所以速度遜色一些,new String()需要重新創建一個字符串對象,速度最慢。

8.[頂]當需要將浮點數轉換成整型時,應該使用Math.floor()或者Math.round()。而不是使用parseInt(),該方法用于將字符串轉換成數字。而且Math是內部對象,所以Math.floor()其實并沒有多少查詢方法和調用時間,速度是最快的。

9.盡量作用JSON格式來創建對象,而不是var obj=new Object()方法。因為前者是直接復制,而后者需要調用構造器,因而前者的性能更好。

10.當需要使用數組時,也盡量使用JSON格式的語法,即直接使用如下語法定義數組:[parrm,param,param...],而不是采用 new Array(parrm,param,param...)這種語法。因為使用JSON格式的語法是引擎直接解釋的。而后者則需要調用Array的構造器。

11.[頂]對字符串進行循環操作,例如替換、查找,就使用正則表達式。因為JS的循環速度比較慢,而正則表達式的操作是用C寫成的API,性能比較好。

最后有一個基本原則,對于大的JS對象,因為創建時時間和空間的開銷都比較大,因此應該盡量考慮采用緩存。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 篮球地板厂家_舞台木地板品牌_体育运动地板厂家_凯洁地板 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 苹果售后维修点查询,苹果iPhone授权售后维修服务中心 – 修果网 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 淘气堡_室内儿童乐园_户外无动力儿童游乐设备-高乐迪(北京) | 洗砂机械-球磨制砂机-洗沙制砂机械设备_青州冠诚重工机械有限公司 | 上海软件开发-上海软件公司-软件外包-企业软件定制开发公司-咏熠科技 | 网站建设-网站制作-网站设计-网站开发定制公司-网站SEO优化推广-咏熠软件 | 不锈钢搅拌罐_高速搅拌罐厂家-无锡市凡格德化工装备科技有限公司 | 冷柜风机-冰柜电机-罩极电机-外转子风机-EC直流电机厂家-杭州金久电器有限公司 | 吊篮式|移动式冷热冲击试验箱-二槽冷热冲击试验箱-广东科宝 | 发电机组|柴油发电机组-批发,上柴,玉柴,潍柴,康明斯柴油发电机厂家直销 | 长沙中央空调维修,中央空调清洗维保,空气能热水工程,价格,公司就找维小保-湖南维小保环保科技有限公司 | 山东氧化铁红,山东铁红-淄博科瑞化工有限公司 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 旋振筛_不锈钢旋振筛_气旋筛_旋振筛厂家—新乡市大汉振动机械有限公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 罐体电伴热工程-消防管道电伴热带厂家-山东沃安电气 | 传动滚筒_厂家-淄博海恒机械制造厂 | 不锈钢发酵罐_水果酒发酵罐_谷物发酵罐_山东誉诚不锈钢制品有限公司 | 深圳天际源广告-形象堆头,企业文化墙,喷绘,门头招牌设计制作专家 | 液氮罐(生物液氮罐)百科-无锡爱思科 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 紫外荧光硫分析仪-硫含量分析仪-红外光度测定仪-泰州美旭仪器 | 防勒索软件_数据防泄密_Trellix(原McAfee)核心代理商_Trellix(原Fireeye)售后-广州文智信息科技有限公司 | 深圳富泰鑫五金_五金冲压件加工_五金配件加工_精密零件加工厂 | 专业广州网站建设,微信小程序开发,一物一码和NFC应用开发、物联网、外贸商城、定制系统和APP开发【致茂网络】 | 上海防爆真空干燥箱-上海防爆冷库-上海防爆冷柜?-上海浦下防爆设备厂家? | 鲁尔圆锥接头多功能测试仪-留置针测试仪-上海威夏环保科技有限公司 | Q361F全焊接球阀,200X减压稳压阀,ZJHP气动单座调节阀-上海戎钛 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 钢格板|热镀锌钢格板|钢格栅板|钢格栅|格栅板-安平县昊泽丝网制品有限公司 | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 高压负荷开关-苏州雷尔沃电器有限公司 | 发光字|标识设计|标牌制作|精神堡垒 - 江苏苏通广告有限公司 | 上海办公室设计_办公楼,写字楼装修_办公室装修公司-匠御设计 | 希望影视-高清影视vip热播电影电视剧免费在线抢先看 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 |