国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

2016:編寫高性能的JavaScript

plus2047 / 1518人閱讀

摘要:編寫高性能的翻譯自的文章。編譯器自然地希望能夠處理那些單態(tài)可預(yù)測的數(shù)據(jù)結(jié)構(gòu)參數(shù)統(tǒng)計(jì)等。使用嚴(yán)格比較操作符能夠避免編譯器進(jìn)行類型推導(dǎo)與轉(zhuǎn)換,從而提高一定的性能。另外,與語句在循環(huán)中的性能也是不錯的,這一點(diǎn)使用的時(shí)候不用擔(dān)心。

</>復(fù)制代碼

  1. 2016:編寫高性能的JavaScript翻譯自Felix Maier的文章Writing-Efficient-JavaScript。本文從屬于筆者的Web 前端入門與最佳實(shí)踐中JavaScript 入門與最佳實(shí)踐系列文章。

本文的初衷是想介紹如何利用些簡單的代碼小技巧就能促進(jìn)JavaScript編譯器的優(yōu)化進(jìn)程從而提升代碼運(yùn)行效率。特別是在游戲這種對于垃圾回收速度要求較高,你性能稍微差點(diǎn)用戶就能見到白屏的地方。

Monomorphism:單態(tài)性

JavaScript中允許函數(shù)調(diào)用時(shí)候傳入動態(tài)參數(shù),不過就以簡單的2參數(shù)函數(shù)為例,當(dāng)你的參數(shù)類型、參數(shù)數(shù)目與返回類型動態(tài)調(diào)用時(shí)才能決定,編譯器需要更多的時(shí)間來解析。編譯器自然地希望能夠處理那些單態(tài)可預(yù)測的數(shù)據(jù)結(jié)構(gòu)、參數(shù)統(tǒng)計(jì)等。

</>復(fù)制代碼

  1. function example(a, b) {
  2. // we expect a, b to be numeric
  3. console.log(++a * ++b);
  4. };
  5. example(); // bad
  6. example(1); // still bad
  7. example("1", 2); // dammit meg
  8. example(1, 2); // good
Constants:常量

使用常量能夠讓編譯器在編譯時(shí)即完成變量的值替換:

</>復(fù)制代碼

  1. const a = 42; // we can easily unfold this
  2. const b = 1337 * 2; // we can resolve this expression
  3. const c = a + b; // still can be resolved
  4. const d = Math.random() * c; // we can only unfold "c"
  5. // before unfolding
  6. a;
  7. b;
  8. c;
  9. d;
  10. // after unfolding
  11. // we can do this at compile time!
  12. 42;
  13. 2674;
  14. 2716;
  15. Math.random() * 2716;
Inlining:內(nèi)聯(lián)

JIT編譯器能夠找出你的代碼中被執(zhí)行次數(shù)最多的部分,將你的代碼分割成多個(gè)小的代碼塊能夠有助于編譯器在編譯時(shí)將這些代碼塊轉(zhuǎn)化為內(nèi)聯(lián)格式然后增加執(zhí)行速度。

Data Types:數(shù)據(jù)類型

盡可能地多用Numbers與Booleans類型,因?yàn)樗麄兣c其他類似于字符串等原始類型相比性能表現(xiàn)更好。使用字符串類型可能會帶來額外的垃圾回收消耗。

</>復(fù)制代碼

  1. const ROBOT = 0;
  2. const HUMAN = 1;
  3. const SPIDER = 2;
  4. let E_TYPE = {
  5. Robot: ROBOT,
  6. Human: HUMAN,
  7. Spider: SPIDER
  8. };
  9. // bad
  10. // avoid uncached strings in heavy tasks (or better in general)
  11. if (entity.type === "Robot") {
  12. }
  13. // good
  14. // the compiler can resolve member expressions
  15. // without much deepness pretty fast
  16. if (entity.type === E_TYPE.Robot) {
  17. }
  18. // perfect
  19. // right side of binary expression can even get unfold
  20. if (entity.type === ROBOT) {
  21. }
Strict & Abstract Operators

盡可能使用===這個(gè)嚴(yán)格比較操作符而不是==操作符。使用嚴(yán)格比較操作符能夠避免編譯器進(jìn)行類型推導(dǎo)與轉(zhuǎn)換,從而提高一定的性能。

Strict Conditions

JavaScript中的if語句也非常靈活,你可以直接在if(a) then bla這個(gè)類型的條件選擇語句中傳入隨意類似的a值。不過這種情況下,就像上文提及的嚴(yán)格比較操作符與寬松比較操作符一樣,編譯器需要將其轉(zhuǎn)化為多個(gè)數(shù)據(jù)類型進(jìn)行比較,而不能立刻得出結(jié)果。當(dāng)然,這并不是一味的反對使用簡寫方式,而是在非常強(qiáng)調(diào)性能的場景,還是建議做好每一個(gè)細(xì)節(jié)的優(yōu)化:

</>復(fù)制代碼

  1. let a = 2;
  2. // bad
  3. // abstracts to check in the worst case:
  4. // - is value equal to true
  5. // - is value greater than zero
  6. // - is value not null
  7. // - is value not NaN
  8. // ..
  9. if (a) {
  10. // if a is true, do something
  11. }
  12. // good
  13. if (a === 2) {
  14. // do sth
  15. }
  16. // same goes for functions
  17. function b() {
  18. return (!false);
  19. };
  20. if (b()) {
  21. // get in here slow
  22. }
  23. if (b() === true) {
  24. // get in here fast
  25. // the compiler knows a specific value to compare with
  26. }
Arguments

盡可能避免使用arguments[index]方式進(jìn)行參數(shù)獲取,并且盡量避免修改傳入的參數(shù)變量:

</>復(fù)制代碼

  1. function mul(a, b) {
  2. return (arguments[0]*arguments[1]); // bad, very slow
  3. return (a*b); // good
  4. };
  5. function test(a, b) {
  6. a = 5; // bad, dont modify argument identifiers
  7. let tmp = a; // good
  8. tmp *= 2; // we can now modify our fake "a"
  9. };
Toxicity:這些關(guān)鍵字有毒 Toxicity

如下列舉的幾個(gè)語法特性會影響優(yōu)化進(jìn)程:

eval

with

try/catch

同時(shí)盡量避免在函數(shù)內(nèi)聲明函數(shù)或者閉包,可能在大量的運(yùn)算中導(dǎo)致過多的垃圾回收操作。

Objecs

Object實(shí)例通常會共享隱類,因此當(dāng)我們訪問或者設(shè)置某個(gè)實(shí)例的未預(yù)定義變量值的時(shí)候會創(chuàng)建一個(gè)隱類。

</>復(fù)制代碼

  1. // our hidden class "hc_0"
  2. class Vector {
  3. constructor(x, y) {
  4. // compiler finds and expects member declarations here
  5. this.x = x;
  6. this.y = y;
  7. }
  8. };
  9. // both vector objects share hidden class "hc_0"
  10. let vec1 = new Vector(0, 0);
  11. let vec2 = new Vector(2, 2);
  12. // bad, vec2 got hidden class "hc_1" now
  13. vec2.z = 0;
  14. // good, compiler knows this member
  15. vec2.x = 1;
Loops

盡可能的緩存數(shù)組長度的計(jì)算值,并且盡可能在同一個(gè)數(shù)組中存放單個(gè)類型。避免使用for-in語法來遍歷某個(gè)數(shù)組,因?yàn)樗娴暮苈A硗猓琧ontinue與break語句在循環(huán)中的性能也是不錯的,這一點(diǎn)使用的時(shí)候不用擔(dān)心。另外,盡可能將短小的邏輯部分拆分到獨(dú)立的函數(shù)中,這樣更有利于編譯器進(jìn)行優(yōu)化。另外,使用前綴自增表達(dá)式,也能帶來小小的性能提升。(++i代替i++)

</>復(fù)制代碼

  1. let badarray = [1, true, 0]; // bad, dont mix types
  2. let array = [1, 0, 1]; // happy compiler
  3. // bad choice
  4. for (let key in array) {
  5. };
  6. // better
  7. // but always try to cache the array size
  8. let i = 0;
  9. for (; i < array.length; ++i) {
  10. key = array[i];
  11. };
  12. // good
  13. let i = 0;
  14. let key = null;
  15. let length = array.length;
  16. for (; i < length; ++i) {
  17. key = array[i];
  18. };
drawImage

draeImage函數(shù)算是最快的2D Canvas API之一了,不過我們需要注意的是如果為了圖方便省略了全參數(shù)傳入,也會增加性能損耗:

</>復(fù)制代碼

  1. // bad
  2. ctx.drawImage(
  3. img,
  4. x, y
  5. );
  6. // good
  7. ctx.drawImage(
  8. img,
  9. // clipping
  10. sx, sy,
  11. sw, sh,
  12. // actual stuff
  13. x, y,
  14. w, h
  15. );
  16. // much hax
  17. // no subpixel rendering by passing integers
  18. ctx.drawImage(
  19. img,
  20. sx|0, sy|0,
  21. sw|0, sh|0,
  22. x|0, y|0,
  23. w|0, h|0
  24. );

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/81042.html

相關(guān)文章

  • 2016年度 JavaScript 展望(下)

    摘要:與是年最早公開發(fā)布的兩個(gè)框架,后來者還包括與。此外,另一重心是與團(tuán)隊(duì)的合作,預(yù)計(jì)將貫穿年。年展望對平臺而言,年的重點(diǎn)是提升穩(wěn)定性與采納率。最早由開發(fā),于年公開發(fā)布。時(shí)間會告訴我們,的極速增長能否在年持續(xù)下去。 【編者按】本文作者為資深 Web 開發(fā)者 TJ VanToll, TJ 專注于移動端 Web 應(yīng)用及其性能,是《jQuery UI 實(shí)踐》 一書的作者。 本文系 OneAPM 工...

    XGBCCC 評論0 收藏0
  • JavaScript 開發(fā)者所需要知道 V8(一):V8 In NodeJS

    摘要:歡迎來我的博客閱讀開發(fā)者所需要知道的一是一款擁有自動垃圾回收功能的編程語言。它隨著的第一版發(fā)布而發(fā)布以及開源。年月,基金宣布和合并,合并版本在未來發(fā)布。年月日,官方公布又一個(gè)新的名為的優(yōu)化編譯器,主要提供的新語法,以及提高性能。 歡迎來我的博客閱讀:「JavaScript 開發(fā)者所需要知道的 V8(一):V8 In NodeJS」 Motivation JavaScript 是一款擁有...

    Lemon_95 評論0 收藏0
  • (譯 & 轉(zhuǎn)載) 2016 JavaScript 后起之秀

    摘要:在年成為最大贏家,贏得了實(shí)現(xiàn)的風(fēng)暴之戰(zhàn)。和他的競爭者位列第二沒有前端開發(fā)者可以忽視和它的生態(tài)系統(tǒng)。他的殺手級特性是探測功能,通過檢查任何用戶的功能,以直觀的方式讓開發(fā)人員檢查所有端點(diǎn)。 2016 JavaScript 后起之秀 本文轉(zhuǎn)載自:眾成翻譯譯者:zxhycxq鏈接:http://www.zcfy.cc/article/2410原文:https://risingstars2016...

    darry 評論0 收藏0
  • 2016年前端開發(fā)學(xué)習(xí)計(jì)劃

    摘要:年,軟件開發(fā)界發(fā)生了很多變化。六數(shù)據(jù)存儲是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典公司開發(fā),目前屬于旗下公司。最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在應(yīng)用方面是最好的,關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用軟件之一。七是最新的修訂版本,年月由萬維網(wǎng)聯(lián)盟完成標(biāo)準(zhǔn)制定。 2015年,軟件開發(fā)界發(fā)生了很多變化。有很多流行的新語言發(fā)布了,也有很多重要的框架和工具發(fā)布了新版本。下面有一個(gè)我們覺得最重要的簡短清單,同時(shí)也有我們覺...

    asoren 評論0 收藏0
  • 2016年前端開發(fā)學(xué)習(xí)計(jì)劃

    摘要:年,軟件開發(fā)界發(fā)生了很多變化。六數(shù)據(jù)存儲是一個(gè)關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典公司開發(fā),目前屬于旗下公司。最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在應(yīng)用方面是最好的,關(guān)系數(shù)據(jù)庫管理系統(tǒng)應(yīng)用軟件之一。七是最新的修訂版本,年月由萬維網(wǎng)聯(lián)盟完成標(biāo)準(zhǔn)制定。 2015年,軟件開發(fā)界發(fā)生了很多變化。有很多流行的新語言發(fā)布了,也有很多重要的框架和工具發(fā)布了新版本。下面有一個(gè)我們覺得最重要的簡短清單,同時(shí)也有我們覺...

    Null 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<