華為開發(fā)之ArkTS高性能編程實(shí)踐 2024-07-04 周四

簡介

JS的性能沒法和C++比套利,有些編碼習(xí)慣會(huì)影響性能敦腔,優(yōu)先選擇高效的寫法雀瓢。
參考文章

高效寫法

  • 變量默認(rèn)用const修飾翎卓,編譯不過了改成let
const index = 10000; // 該變量在后續(xù)過程中未發(fā)生改變纵潦,建議聲明成常量
  • 避免整形和浮點(diǎn)型混用泪掀。既然這樣听绳,為什么不推出int和double關(guān)鍵字,非要弄個(gè)number异赫?
let intNum = 1;
intNum = 1.1;  // 該變量在聲明時(shí)為整型數(shù)據(jù)椅挣,建議后續(xù)不要賦值浮點(diǎn)型數(shù)據(jù)

let doubleNum = 1.1;
doubleNum = 1;  // 該變量在聲明時(shí)為浮點(diǎn)型數(shù)據(jù)头岔,建議后續(xù)不要賦值整型數(shù)據(jù)
  • 循環(huán)中常量提取,減少屬性訪問次數(shù)
class Time {
  static start: number = 0;
  static info: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
}

/// 不好的寫法
function getNum(num: number): number {
  let total: number = 348;
  for (let index: number = 0x8000; index > 0x8; index >>= 1) {
    // 此處會(huì)多次對Time的info及start進(jìn)行查找鼠证,并且每次查找出來的值是相同的
    total += ((Time.info[num - Time.start] & index) !== 0) ? 1 : 0;
  }
  return total;
}
class Time {
  static start: number = 0;
  static info: number[] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
}

/// 好的寫法
function getNum(num: number): number {
  let total: number = 348;
  const info = Time.info[num - Time.start];  // 從循環(huán)中提取不變量
  for (let index: number = 0x8000; index > 0x8; index >>= 1) {
    if ((info & index) != 0) {
      total++;
    }
  }
  return total;
}
  • 使用參數(shù)傳遞函數(shù)外的變量
/// 使用閉包會(huì)造成額外的閉包創(chuàng)建和訪問開銷
let arr = [0, 1, 2];

function foo(): number {
  return arr[0] + arr[1];
}

foo();
/// 使用參數(shù)傳遞函數(shù)外的變量來替代使用閉包峡竣。
let arr = [0, 1, 2];

function foo(array: number[]): number {
  return array[0] + array[1];
}

foo(arr);
  • 避免使用可選參數(shù),用默認(rèn)參數(shù)替代
/// 函數(shù)的可選參數(shù)表示參數(shù)可能為undefined量九,在函數(shù)內(nèi)部使用該參數(shù)時(shí)适掰,需要進(jìn)行非空值的判斷,造成額外的開銷荠列。
function add(left?: number, right?: number): number | undefined {
  if (left != undefined && right != undefined) {
    return left + right;
  }
  return undefined;
}
/// 使用默認(rèn)參數(shù)类浪,減少空判斷,提高性能
function add(left: number = 0, right: number = 0): number {
  return left + right;
}
  • 數(shù)值數(shù)組推薦使用TypedArray肌似,既然這樣费就,推出number類型的意義在哪里?恢復(fù)int和double不是更好川队?
/// 純數(shù)字力细,用number性能低
const arr1 = new Array<number>([1, 2, 3]);
const arr2 = new Array<number>([4, 5, 6]);
let res = new Array<number>(3);
for (let i = 0; i < 3; i++) {
  res[i] = arr1[i] + arr2[i];
}
const typedArray1 = new Int8Array([1, 2, 3]);
const typedArray2 = new Int8Array([4, 5, 6]);
let res = new Int8Array(3);
for (let i = 0; i < 3; i++) {
  res[i] = typedArray1[i] + typedArray2[i];
}
  • 運(yùn)行時(shí)在分配超過1024大小的數(shù)組或者針對稀疏數(shù)組,會(huì)采用hash表的方式來存儲(chǔ)元素呼寸。在該模式下艳汽,相比于用偏移訪問數(shù)組元素速度較慢。在代碼開發(fā)時(shí)对雪,應(yīng)盡量避免數(shù)組變成稀疏數(shù)組河狐。
// 直接分配100000大小的數(shù)組,運(yùn)行時(shí)會(huì)處理成用hash表來存儲(chǔ)元素
let count = 100000;
let result: number[] = new Array(count);

// 創(chuàng)建數(shù)組后瑟捣,直接在9999處賦值馋艺,會(huì)變成稀疏數(shù)組
let result: number[] = new Array();
result[9999] = 0;
  • 避免使用聯(lián)合類型數(shù)組
let arrNum: number[] = [1, 1.1, 2];  // 數(shù)值數(shù)組中混合使用整型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)

let arrUnion: (number | string)[] = [1, 'hello'];  // 聯(lián)合類型數(shù)組
/// 根據(jù)業(yè)務(wù)需要,將相同類型的數(shù)據(jù)放置在同一數(shù)組中
let arrInt: number[] = [1, 2, 3];
let arrDouble: number[] = [0.1, 0.2, 0.3];
let arrString: string[] = ['hello', 'world'];
  • 避免頻繁拋出異常
/// 創(chuàng)建異常時(shí)會(huì)構(gòu)造異常的棧幀迈套,造成性能損耗捐祠。
function div(a: number, b: number): number {
  if (a <= 0 || b <= 0) {
    throw new Error('Invalid numbers.')
  }
  return a / b
}

function sum(num: number): number {
  let sum = 0
  try {
    for (let t = 1; t < 100; t++) {
      sum += div(t, num)
    }
  } catch (e) {
    console.log(e.message)
  }
  return sum
}
/// 用特殊值NaN替代異常,提高性能
function div(a: number, b: number): number {
  if (a <= 0 || b <= 0) {
    return NaN
  }
  return a / b
}

function sum(num: number): number {
  let sum = 0
  for (let t = 1; t < 100; t++) {
    if (t <= 0 || num <= 0) {
      console.log('Invalid numbers.')
    }
    sum += div(t, num)
  }
  return sum
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末桑李,一起剝皮案震驚了整個(gè)濱河市踱蛀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贵白,老刑警劉巖率拒,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異禁荒,居然都是意外死亡猬膨,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門呛伴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勃痴,“玉大人谒所,你說我怎么就攤上這事∨嫔辏” “怎么了劣领?”我有些...
    開封第一講書人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铁材。 經(jīng)常有香客問我剖踊,道長,這世上最難降的妖魔是什么衫贬? 我笑而不...
    開封第一講書人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮歇攻,結(jié)果婚禮上固惯,老公的妹妹穿的比我還像新娘。我一直安慰自己缴守,他們只是感情好葬毫,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屡穗,像睡著了一般贴捡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上村砂,一...
    開封第一講書人閱讀 51,245評(píng)論 1 299
  • 那天烂斋,我揣著相機(jī)與錄音,去河邊找鬼础废。 笑死汛骂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的评腺。 我是一名探鬼主播帘瞭,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蒿讥!你這毒婦竟也來了蝶念?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬榮一對情侶失蹤芋绸,失蹤者是張志新(化名)和其女友劉穎媒殉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體侥钳,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡适袜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舷夺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苦酱。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡售貌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出疫萤,到底是詐尸還是另有隱情颂跨,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布扯饶,位于F島的核電站恒削,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尾序。R本人自食惡果不足惜钓丰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望每币。 院中可真熱鬧携丁,春花似錦、人聲如沸兰怠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽揭保。三九已至肥橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間秸侣,已是汗流浹背存筏。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留塔次,地道東北人方篮。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像励负,于是被迫代替她去往敵國和親藕溅。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容