鴻蒙Next ArkTS高性能編程實(shí)戰(zhàn)

一盛撑、引言

在應(yīng)用開發(fā)中植阴,高性能編程對于提升用戶體驗至關(guān)重要。本文將詳細(xì)介紹鴻蒙Next ArkTS在高性能編程方面的實(shí)踐經(jīng)驗勤家,包括聲明與表達(dá)式腹尖、函數(shù)、數(shù)組以及異常處理等方面的優(yōu)化技巧伐脖,助力開發(fā)者打造高效能的應(yīng)用热幔。

二、聲明與表達(dá)式

(一)使用const聲明不變的變量

在編程過程中讼庇,對于那些在后續(xù)代碼中不會發(fā)生改變的變量断凶,應(yīng)使用const進(jìn)行聲明。這樣做不僅可以使代碼意圖更加清晰巫俺,還能幫助編譯器進(jìn)行優(yōu)化认烁。例如:

const index = 10000; // 該變量在后續(xù)過程中未發(fā)生改變,建議聲明成常量

(二)number類型變量避免整型和浮點(diǎn)型混用

ArkTS運(yùn)行時在優(yōu)化時會區(qū)分整型和浮點(diǎn)型數(shù)據(jù)介汹,因此建議在初始化后避免改變number類型變量的數(shù)據(jù)類型却嗡。例如:

let intNum = 1;
intNum = 1.1; // 該變量在聲明時為整型數(shù)據(jù),建議后續(xù)不要賦值浮點(diǎn)型數(shù)據(jù)

let doubleNum = 1.1;
doubleNum = 1; // 該變量在聲明時為浮點(diǎn)型數(shù)據(jù)嘹承,建議后續(xù)不要賦值整型數(shù)據(jù)

(三)數(shù)值計算避免溢出

在進(jìn)行數(shù)值計算時窗价,要特別注意可能導(dǎo)致溢出的情況。常見的溢出場景包括加法叹卷、減法撼港、乘法、指數(shù)運(yùn)算以及&(and)骤竹、>>>(無符號右移)等運(yùn)算操作帝牡。溢出會導(dǎo)致引擎進(jìn)入慢速的溢出邏輯分支處理,影響性能蒙揣。因此靶溜,應(yīng)確保數(shù)值在合適的范圍內(nèi),避免大于INT32_MAX或小于INT32_MIN(對于某些運(yùn)算操作懒震,如&罩息、>>>等,應(yīng)避免大于INT32_MAX)个扰。

(四)循環(huán)中常量提取瓷炮,減少屬性訪問次數(shù)

在循環(huán)中,如果存在大量對常量的訪問操作递宅,且這些常量在循環(huán)過程中不會改變娘香,那么可以將其提取到循環(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) {
        // 此處會多次對Time的info及start進(jìn)行查找舞痰,并且每次查找出來的值是相同的
        total += ((Time.info[num - Time.start] & index)!== 0)? 1 : 0;
    }
    return total;
}

// 優(yōu)化后代碼
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ù)傳遞函數(shù)外的變量

使用閉包會帶來額外的閉包創(chuàng)建和訪問開銷诀姚。在性能敏感場景中响牛,應(yīng)盡量使用參數(shù)傳遞函數(shù)外的變量來替代閉包。例如:

// 不推薦使用閉包的方式
let arr = [0, 1, 2];
function foo(): number {
    return arr[0] + arr[1];
}
foo();

// 推薦使用參數(shù)傳遞變量
let arr = [0, 1, 2];
function foo(array: number[]): number {
    return array[0] + array[1];
}
foo(arr);

(二)避免使用可選參數(shù)

函數(shù)的可選參數(shù)表示參數(shù)可能為undefined赫段,在函數(shù)內(nèi)部使用該參數(shù)時呀打,需要進(jìn)行非空值的判斷,這會造成額外的開銷糯笙。因此贬丛,根據(jù)業(yè)務(wù)需求,應(yīng)將函數(shù)參數(shù)聲明為必須參數(shù)给涕,或者考慮使用默認(rèn)參數(shù)豺憔。例如:

// 不推薦使用可選參數(shù)
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ù)值數(shù)組推薦使用TypedArray

在涉及純數(shù)值計算的場景中够庙,推薦使用TypedArray數(shù)據(jù)結(jié)構(gòu)恭应。它能夠提供更好的性能表現(xiàn)。例如:

// 優(yōu)化前
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];
}

// 優(yōu)化后
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];
}

(二)避免使用稀疏數(shù)組

當(dāng)運(yùn)行時分配超過1024大小的數(shù)組或者處理稀疏數(shù)組時耘眨,會采用hash表的方式來存儲元素昼榛,這相比于用偏移訪問數(shù)組元素速度較慢。因此剔难,在代碼開發(fā)過程中胆屿,應(yīng)盡量避免數(shù)組變成稀疏數(shù)組。例如:

// 直接分配100000大小的數(shù)組偶宫,運(yùn)行時會處理成用hash表來存儲元素
let count = 100000;
let result: number[] = new Array(count);

// 創(chuàng)建數(shù)組后非迹,直接在9999處賦值,會變成稀疏數(shù)組
let result: number[] = new Array();
result[9999] = 0;

(三)避免使用聯(lián)合類型數(shù)組

應(yīng)避免在數(shù)值數(shù)組中混合使用整型數(shù)據(jù)和浮點(diǎn)型數(shù)據(jù)读宙,以及使用聯(lián)合類型數(shù)組彻秆。根據(jù)業(yè)務(wù)需求楔绞,將相同類型的數(shù)據(jù)放置在同一數(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ù)組

// 推薦的寫法
let arrInt: number[] = [1, 2, 3];
let arrDouble: number[] = [0.1, 0.2, 0.3];
let arrString: string[] = ['hello', 'world'];

五、異常

避免頻繁拋出異常

創(chuàng)建異常時會構(gòu)造異常的棧幀酒朵,這會造成性能損耗桦锄。在性能敏感場景下,如for循環(huán)語句中蔫耽,應(yīng)避免頻繁拋出異常结耀。例如:

// 優(yō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
}

// 優(yōu)化后
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
}

通過遵循以上鴻蒙Next ArkTS高性能編程實(shí)踐中的各項建議留夜,開發(fā)者可以在實(shí)際開發(fā)中顯著提升應(yīng)用的性能表現(xiàn),為用戶帶來更加流暢和高效的使用體驗图甜。同時碍粥,不斷總結(jié)和運(yùn)用高性能編程技巧,也是打造優(yōu)質(zhì)應(yīng)用的重要環(huán)節(jié)黑毅。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嚼摩,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子矿瘦,更是在濱河造成了極大的恐慌枕面,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缚去,死亡現(xiàn)場離奇詭異潮秘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)易结,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門枕荞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搞动,你說我怎么就攤上這事买猖。” “怎么了滋尉?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵玉控,是天一觀的道長。 經(jīng)常有香客問我狮惜,道長高诺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任碾篡,我火速辦了婚禮虱而,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘开泽。我一直安慰自己牡拇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布穆律。 她就那樣靜靜地躺著惠呼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峦耘。 梳的紋絲不亂的頭發(fā)上剔蹋,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天,我揣著相機(jī)與錄音辅髓,去河邊找鬼泣崩。 笑死少梁,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的矫付。 我是一名探鬼主播凯沪,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼买优!你這毒婦竟也來了著洼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤而叼,失蹤者是張志新(化名)和其女友劉穎身笤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體葵陵,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡液荸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脱篙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娇钱。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绊困,靈堂內(nèi)的尸體忽然破棺而出文搂,到底是詐尸還是另有隱情,我是刑警寧澤秤朗,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布煤蹭,位于F島的核電站,受9級特大地震影響取视,放射性物質(zhì)發(fā)生泄漏硝皂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一作谭、第九天 我趴在偏房一處隱蔽的房頂上張望稽物。 院中可真熱鬧,春花似錦折欠、人聲如沸贝或。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咪奖。三九已至,卻和暖如春农猬,著一層夾襖步出監(jiān)牢的瞬間赡艰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工斤葱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留慷垮,地道東北人。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓揍堕,卻偏偏與公主長得像料身,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子衩茸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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