MoonLight 是 iOS/Mac 上的轻量化的性能测试组件,它可以单独集成在任何 App 中实现自动化性能数据的采集,你可以非常轻松的获取到 App CPU、System CPU、App Memory、System GPU 以及 GPU Info 的数据。MoonLight 由声网Agora 开发,并已开源至 Github。

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

图片

Photo by Lester Salmins on Unsplash

为什么我们要做这样一个开源工具呢?大家可能遇到过这样的情况图片

MoonLight 的愿景

MoonLight,它的中文意思名为月光。月光弥漫在地球之上是宁静且自然的,月光会给予地球上的人们以指引。而月光的寓意恰好和我们开发性能测试组件的出发点相契合。我们希望 iOS/Mac 的性能测试也能像月光一样,轻松且自然。MoonLight 有着更低的性能消耗,更容易的使用方式,更精准的性能数据。它将帮助开发团队更快速更精确的定位性能问题,进而推动性能优化和提升。帮助测试团队更快更准的获取性能数据,提升测试效率。对比其他的性能测试工具InstrumentsMoonLight 采集到的性能数据是基本和 Instruments 保持一致的。具体的优劣对比如下:

1. Instruments 无法实现性能自动化,无法将获取到的性能数据提取出来进行分析,最后提供出去的性能数据准确度不够,存在人为误差。MoonLight 可以解决这个问题。

2. Instruments 无法实现远程性能测试,自然也无法实现高并发的性能测试,通常来说需要一台设备连接 USB 线后测试,然后一台测试完再测试下一台。MoonLight 可以一次性测试非常多台,也没有必须连接数据线的要求。

3. 高版本的 Instruments 无法测试一些低端系统机器的性能,MoonLight 可以完美支持。

4. 对于 macOS 上的 App, Instruments 是不支持 GPU 的输出,MoonLight 支持。经过测试,GPU 的输出和 macOS 自带的活动管理器 GPU 输出保持一致。

5. Instruments 优点是数据可视化,并且可以提供内存泄漏测试。MoonLight 暂时不提供数据可视化,但是由于 MoonLight 是可编程的,当开发者拿到相关的性能数据后, 可以自行实现数据上报或者可视化的处理。

GTGT 是 Tencent 开源的性能测试组件。

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

2. GT 采集到的 App Memory 数据和 Instruments 是不一致的。GT 无法输出 GPU、System CPU, 但是 MoonLight 可以。

3. GT 集成到 App 中,需要添加非常多的依赖库,取消掉 Bitcode 支持,自身也比较庞大,并且会增加 App 的包大小。MoonLight 更轻量化,对于 iOS 仅仅只需要增加一个系统库,对于 Mac 不需要增加任何的系统库。

Perfdog

1. Perfdog 无法支持 macOS 上的 App 的性能测试。

2. Perfdog 并非是一个自动化的性能测试工具,优点是数据可视化。

3. Perfdog 并非是一个开源的测试工具,之前在 iOS 14 上出现过 App CPU 不准的 Bug, 而我们也并不清楚其实现的原理和代码,未来依旧有可能在某些系统上出现性能项测试不准的情况。

MoonLight 安装与使用

运行环境

  • iOS 8.0+

  • macOS 10.11+

安装

Cocoapods

  • iOS:

注意:请不要用在 AppStore release 版本上,建议在 debug 版本上使用。

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

pod 'MoonLight_macOS'

MoonLight 的使用

// 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 自测的结果iOS/Mac MoonLight 自身的性能消耗非常低,几乎可以忽略不计。测试的过程中,性能输出稳定,App CPU、System CPU、App Memory、GPU 可以和 Instruments 或者活动监视器结果保持一致。1. MoonLight VS Instruments

  • iOS

图片

  • macOS

图片

注:MoonLight 对 CPU 有做归一化处理. CPU(MoonLight) = CPU(Instruments) / 核心数

2. MoonLight 自身的性能消耗测试 case: 

Step1:打开 App,打开 MoonLight 的检测,得出测试性能 data1。

Step2:打开 App, 不打开 MoonLight 的检测,测出测试性能 data2。

最后的性能消耗 = data1 - data2。

  • iOS 端,我们的测试环境是 iPhone XS iOS 14.2(六核)。

测试结果:

App Memory 消耗 = 7.38-7.34 = 0.04Mb ;

App CPU 消耗 = (2.1%-0.1%)/ (6 核) = 0.33% ;

GPU = 0% ;

并且整个性能测试阶段,数据波动稳定,不会出现 MoonLight 的开启造成性能有不稳定变化。

  • macOS 端,测试环境是 Macbook Pro 2017 13.3 Intel i5 , System: BigSur 11.0.1

测试结果:

App Memory 消耗 = 14.42-14.36 = 0.06Mb ;

App CPU 消耗 = (0.08%-0.0%)/ (4 核) = 0.02% ;

GPU = 0% ;

并且整个性能测试阶段,数据波动稳定,不会出现 MoonLight 的开启造成性能有不稳定变化。

写在最后

MoonLight 是我们从日常的开发中诞生的开源工具,我们希望它能帮助开发团队更快速更精确的定位性能问题,进而推动性能优化和提升;帮助测试团队更快更准的获取性能数据,提升测试效率。欢迎大家使用。

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

2 月 3 日晚间的 Agora Talk 直播中,大家还可以来与 MoonLight 的作者一起交流互动哦!扫描下方海报二维码即可报名

图片