開源 | MoonLight —— iOS/Mac 輕量化的性能測試組件

作者:聲網(wǎng)Agora 劉君杰

什么是 MoonLight?

MoonLight 是 iOS/Mac 上的輕量化的性能測試組件,它可以單獨(dú)集成在任何 App 中實(shí)現(xiàn)自動(dòng)化性能數(shù)據(jù)的采集,你可以非常輕松的獲取到 App CPU、System CPU、App Memory、System GPU 以及 GPU Info 的數(shù)據(jù)。MoonLight 由聲網(wǎng)Agora 開發(fā),并已開源至 Github。

開源地址:https://github.com/AgoraIO-Community/MoonLight

MoonLight 的愿景

MoonLight,它的中文意思名為月光。月光彌漫在地球之上是寧靜且自然的,月光會(huì)給予地球上的人們以指引。而月光的寓意恰好和我們開發(fā)性能測試組件的出發(fā)點(diǎn)相契合。

我們希望 iOS/Mac 的性能測試也能像月光一樣,輕松且自然。MoonLight 有著更低的性能消耗,更容易的使用方式,更精準(zhǔn)的性能數(shù)據(jù)。它將幫助開發(fā)團(tuán)隊(duì)更快速更精確的定位性能問題,進(jìn)而推動(dòng)性能優(yōu)化和提升。幫助測試團(tuán)隊(duì)更快更準(zhǔn)的獲取性能數(shù)據(jù),提升測試效率。

對(duì)比其他的性能測試工具

Instruments

MoonLight采集到的性能數(shù)據(jù)是基本和Instruments保持一致的。具體的優(yōu)劣對(duì)比如下:

  1. Instruments無法實(shí)現(xiàn)性能自動(dòng)化,無法將獲取到的性能數(shù)據(jù)提取出來進(jìn)行分析,最后提供出去的性能數(shù)據(jù)準(zhǔn)確度不夠,存在人為誤差。MoonLight可以解決這個(gè)問題。

  2. Instruments無法實(shí)現(xiàn)遠(yuǎn)程性能測試,自然也無法實(shí)現(xiàn)高并發(fā)的性能測試,通常來說需要一臺(tái)設(shè)備連接USB線后測試,然后一臺(tái)測試完再測試下一臺(tái)。MoonLight可以一次性測試非常多臺(tái),也沒有必須連接數(shù)據(jù)線的要求。

  3. 高版本的Instruments無法測試一些低端系統(tǒng)機(jī)器的性能,MoonLight可以完美支持。

  4. 對(duì)于macOS上的App, Instruments是不支持GPU的輸出,MoonLight支持。進(jìn)過測試,GPU的輸出和macOS自帶的活動(dòng)管理器GPU輸出保持一致。

  5. Instruments優(yōu)點(diǎn)是數(shù)據(jù)可視化,并且可以提供內(nèi)存泄漏測試。MoonLight暫時(shí)不提供數(shù)據(jù)可視化,但是由于MoonLight是可編程的,當(dāng)開發(fā)者拿到相關(guān)的性能數(shù)據(jù)后, 可以自行實(shí)現(xiàn)數(shù)據(jù)上報(bào)或者可視化的處理。

GT

  1. GT不支持macOS,MoonLight支持。

  2. GT采集到的App Memory數(shù)據(jù)和Instruments是不一致的。GT 無法輸出 GPU、System CPU, 但是MoonLight可以。

  3. GT集成到App中,需要添加非常多的依賴庫,取消掉Bitcode支持,自身也比較龐大,并且會(huì)增加App的包大小。MoonLight更輕量化,對(duì)于iOS僅僅只需要增加一個(gè)系統(tǒng)庫,對(duì)于Mac不需要增加任何的系統(tǒng)庫。

Perfdog

  1. Perfdog無法支持macOS上的App的性能測試。

  2. Perfdog并非是一個(gè)自動(dòng)化的性能測試工具,優(yōu)點(diǎn)是數(shù)據(jù)可視化。

  3. Perfdog并非是一個(gè)開源的測試工具,之前在iOS 14上出現(xiàn)過App CPU不準(zhǔn)的Bug, 而我們也并不清楚其實(shí)現(xiàn)的原理和代碼,未來依舊有可能在某些系統(tǒng)上出現(xiàn)性能項(xiàng)測試不準(zhǔn)的情況。

Requirements

  • iOS 8.0+
  • macOS 10.11+

Installation

Cocoapods

  • iOS:

Warning! For iOS, do not use it on AppStore release. Recommend use it on debug mode.

pod 'MoonLight_iOS', :configurations => ['Debug']
  • macOS:
pod 'MoonLight_macOS'

Usage

// Step1: create MoonLight instance and set sampling interval.
    _moonLight = [[MoonLight alloc]initWithDelegate:self timeInterval:1];

// Step2: start timer.
    [_moonLight startTimer];


// Step3: through the callback, you can get all the performance data per interval.
- (void)captureOutputAppCPU:(float)appCPU systemCPU:(float)systemCPU appMemory:(float)appMemory gpuUsage:(float)gpuUsage gpuInfo:(NSString *)gpuInfo {
    NSLog(@"appMemory:%f", appMemory);
    NSLog(@"appCPU:%f", appCPU);
    NSLog(@"gpuUsage:%f", gpuUsage);
    NSLog(@"systemCPU:%f", systemCPU);
    NSLog(@"gpuInfo:%@", gpuInfo);
}

// Step4:if you want to stop capturing the performance data, use "stopTimer".
    [_moonLight stopTimer];

MoonLight 自測的結(jié)果

iOS/Mac MoonLight 自身的性能消耗非常低,幾乎可以忽略不計(jì);測試的過程中,性能輸出穩(wěn)定;App CPU、System CPU、App Memory、GPU 可以和Instruments或者活動(dòng)監(jiān)視器結(jié)果保持一致。

一、MoonLight VS Instruments

  • iOS
  • macOS

備注:MoonLight對(duì)CPU有做歸一化處理. CPU(MoonLight) = CPU(Instruments) / 核心數(shù)

二、MoonLight 自身的性能消耗

測試case:

Step1: 打開App,打開MoonLight的檢測,測試性能data1。

Step2: 打開App, 不打開MoonLight的檢測,測試性能data2。性能消耗 = data1 - data2

  • iOS

App Memory 消耗 = 7.38-7.34 = 0.04Mb ;App CPU 消耗 = (2.1%-0.1%)/ (6核) = 0.33% ;GPU = 0% ,并且整個(gè)性能測試階段,數(shù)據(jù)波動(dòng)穩(wěn)定,不會(huì)出現(xiàn)MoonLight的開啟造成性能有不穩(wěn)定變化。

測試設(shè)備:iPhone XS iOS 14.2 六核

  • macOS

App Memory 消耗 = 14.42-14.36 = 0.06Mb ;App CPU 消耗 = (0.08%-0.0%)/ (4核) = 0.02% ;GPU = 0% ,并且整個(gè)性能測試階段,數(shù)據(jù)波動(dòng)穩(wěn)定,不會(huì)出現(xiàn)MoonLight的開啟造成性能有不穩(wěn)定變化。

測試設(shè)備:Macbook Pro 2017 13.3 Intel i5 , System: BigSur 11.0.1

————————————————————————————

寫在最后

MoonLight 是我們從日常的開發(fā)中誕生的開源工具,我們希望它能幫助開發(fā)團(tuán)隊(duì)更快速更精確的定位性能問題,進(jìn)而推動(dòng)性能優(yōu)化和提升;幫助測試團(tuán)隊(duì)更快更準(zhǔn)的獲取性能數(shù)據(jù),提升測試效率。歡迎大家使用。

MoonLight 開源地址:https://github.com/AgoraIO-Community/MoonLight

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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