作者:聲網(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ì)比如下:
Instruments無法實(shí)現(xiàn)性能自動(dòng)化,無法將獲取到的性能數(shù)據(jù)提取出來進(jìn)行分析,最后提供出去的性能數(shù)據(jù)準(zhǔn)確度不夠,存在人為誤差。MoonLight可以解決這個(gè)問題。
Instruments無法實(shí)現(xiàn)遠(yuǎn)程性能測試,自然也無法實(shí)現(xiàn)高并發(fā)的性能測試,通常來說需要一臺(tái)設(shè)備連接USB線后測試,然后一臺(tái)測試完再測試下一臺(tái)。MoonLight可以一次性測試非常多臺(tái),也沒有必須連接數(shù)據(jù)線的要求。
高版本的Instruments無法測試一些低端系統(tǒng)機(jī)器的性能,MoonLight可以完美支持。
對(duì)于macOS上的App, Instruments是不支持GPU的輸出,MoonLight支持。進(jìn)過測試,GPU的輸出和macOS自帶的活動(dòng)管理器GPU輸出保持一致。
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
GT不支持macOS,MoonLight支持。
GT采集到的App Memory數(shù)據(jù)和Instruments是不一致的。GT 無法輸出 GPU、System CPU, 但是MoonLight可以。
GT集成到App中,需要添加非常多的依賴庫,取消掉Bitcode支持,自身也比較龐大,并且會(huì)增加App的包大小。MoonLight更輕量化,對(duì)于iOS僅僅只需要增加一個(gè)系統(tǒng)庫,對(duì)于Mac不需要增加任何的系統(tǒng)庫。
Perfdog
Perfdog無法支持macOS上的App的性能測試。
Perfdog并非是一個(gè)自動(dòng)化的性能測試工具,優(yōu)點(diǎn)是數(shù)據(jù)可視化。
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