这是一个无第三方运行时依赖的 Android 原生性能测试应用。首页用于选择测试项目,每个项目使用独立的二级测试页面,方便以后继续增加 CPU、GPU、电池等测试模块。
- 通过可拖动悬浮窗显示全系统物理闪存的实时读取/写入速度、读写 IOPS、忙碌度、队列深度和累计数据量
- 自动识别非移动的 UFS、eMMC、NVMe 物理整盘,排除动态分区、逻辑分区、loop 和 zram,避免重复统计
- 支持 0.5、1、2 秒采样周期;普通读取被 Android 拒绝时复用持久
su会话,停止监控时自动关闭 - Android 16 使用
SYSTEM_ALERT_WINDOW和specialUse前台服务,悬浮窗、通知或设置页均可停止监控 - 可选择详细悬浮窗或两行简洁悬浮窗;简洁模式第一行固定显示闪存 MB/s、第二行固定显示内存 GB/s,仅保留 R/W 与数值并省略单位文字,可拖动并支持双击任意区域关闭
- 内存实时监控复用单个长驻 Root 会话,避免按刷新周期重复申请 Root
- 数据来自 Linux 块层:页缓存命中的读取不计入,缓存写入可能延迟显示,也不代表 UFS 控制器内部的实际 NAND 写入量
- Root 只读显示标准 UFS Pre-EOL、寿命 A/B、WriteBooster 寿命,并实验解码 SK hynix 厂商累计读写、擦除和坏块计数
- 独立内存详细参数页显示物理内存、ZRAM 压缩率、HybridSwap/MemCG 策略,以及本次开机 ZRAM→UFS 的实际压缩数据写入量
- 根据原始容量和平均擦除次数显示 P/E 等效写入及写放大估算;两项明确标注为估算,不能等同于精确物理 NAND 读写量
- 显示设备、SoC、Android、内核、进程架构和支持的 ABI
- 显示每个可用逻辑 CPU 的在线状态、频率范围、当前频率、Cluster/Core ID、Capacity 和调速策略
- 汇总 L1/L2/L3 缓存大小、缓存行、组相联和共享 CPU 范围
- ARM64 通过 Linux ELF
AT_HWCAP/AT_HWCAP2检测 NEON、AES、SHA、CRC32、DotProd、SVE/SVE2、I8MM、BF16、SME 等扩展 - x86_64 通过 CPUID/XGETBV 检测 SSE、AVX/AVX2、FMA、AES-NI、BMI 和 AVX-512 等扩展
- 支持刷新动态信息和一键复制完整报告
- 通过离屏 OpenGL ES 上下文显示 GPU renderer、厂商、OpenGL ES 和 GLSL ES 版本
- 显示 Vulkan Loader/API、物理设备、驱动/设备 ID、内存堆、计算队列、计算限制、扩展和 shaderFloat16 能力
- OpenCL 可用时显示平台、GPU、驱动、计算单元、频率、全局/本地内存、工作组和扩展列表
- Android 10 及以上仅统计系统明确标记为硬件加速的视频解码器,排除软件/CPU 解码器
- 按 AV1、HEVC、AVC、VP9、VP8、Dolby Vision 等 MIME 格式显示硬件解码器名称、最大声明尺寸和厂商性能保证点
- OpenCL
float4FP32 与可选half4FP16 多累加链 FMA 峰值,单位 GFLOPS - GPU 全局内存顺序读取、顺序写入和 buffer 复制带宽,单位 GB/s;写入每轮更换数据并轮换两个目标 buffer
- 16 MiB 以内随机环形索引的单工作项依赖式访问延迟,单位 ns/access
- 可选择 32、64、128 或 256 MiB 数据大小,以及每项 1、2 或 3 秒
- 运行时动态加载厂商
libOpenCL.so;不支持 OpenCL 时不影响其它测试和 GPU 信息显示
- 借鉴 SPEC CPU 2017 的单副本 Speed 与多副本 Rate 测试方法
- 七项共用 C++ 工作负载:整数搜索、LZ 压缩、SHA-256、Sobel 图像、FP32 GEMM、FFT 和流体格点
- 每项显示原始吞吐、归一化分数和固定权重,并生成单核、全核与 CPU 综合总分
- 单核模式可以选择具体 CPU 编号,并通过
sched_setaffinity强制绑定 - 全核模式读取应用当前允许使用的 CPU mask,每个核心启动并绑定一个独立副本
- 可选择单核、全核或两者都测,以及每项 2、3、5 秒测试时长
这些工作负载是本项目自主实现的可重复计算内核,不包含 SPEC CPU 2017 授权源码、输入数据或运行工具,结果不是官方 SPEC 分数,也不能与公开的 SPEC CPU 2017 成绩直接比较。
- 单线程与全核心顺序读取带宽(SIMD 累加)
- 单线程与全核心普通非零写入带宽(原生
memset,在0x5A/0xA5间交替) - 单线程与全核心零填充带宽(原生
memset(0),ARM64 bionic 在硬件支持时可能使用 DC ZVA) - 单线程与全核心内存复制带宽(原生
memcpy) - 单线程随机访问延迟(覆盖整个工作集的数据依赖式指针追逐)
- 连续读取、连续写入吞吐
- 4 KiB 随机读取、随机写入吞吐与 IOPS
- 100 KiB 随机读取、随机写入吞吐与 IOPS
- 4 KiB 随机读取平均/P95 延迟
- 4 KiB 同步随机写入平均/P95 延迟
- 可选择 64、128、256、512 或 1024 MiB 测试数据量
闪存测试在应用私有内部存储中创建一个临时文件,完整测试、取消测试或发生错误后都会尝试自动删除。测试不需要存储权限,也不会访问照片、下载目录或其它应用的数据。
- 在 Android Studio 中打开本目录
MemoryBenchmark。 - 等待 Gradle Sync 完成。
- 连接已启用 USB 调试的 ARM64 手机,选择设备后点击 Run。
- 在应用首页选择 CPU/GPU 信息、CPU、GPU、内存或闪存性能测试。
安装已经生成的调试 APK:
adb install -r app\build\outputs\apk\debug\app-debug.apk命令行重新构建:
$env:JAVA_HOME="C:\Program Files\Android\Android Studio\jbr"
.\gradlew.bat :app:lintDebug :app:assembleDebug- 原生层优先使用
O_DIRECT绕过页缓存;文件系统不支持时自动回退到普通 I/O,并在结果页显示当前模式。 - 连续写和随机写吞吐包含最终
fdatasync时间,避免只测到内存中的脏页写入速度。 - 随机吞吐测试执行约等于所选数据量的逻辑 I/O,访问地址覆盖所选大小的测试文件。
- 4 KiB 同步写延迟使用
O_DSYNC,因此代表同步写入完成时间,不等同于异步写缓存延迟。 - 单位
MB/s为每秒 100 万字节,延迟单位为微秒(µs)。
- “单核速度”只运行一个副本,并要求线程成功绑定到用户选择的 CPU 核心。
- “全核吞吐”在每个可用核心上运行一个独立副本,显示所有副本的总工作量/秒。
- 七项权重依次为 15%、15%、10%、10%、20%、15%、15%,合计 100%。
- 项目分数按 v2.0 固定参考吞吐归一化到 1000 分;模式总分采用加权几何平均,综合总分为单核与全核总分的几何平均。
- 原始单位包括 Mn/s、MB/s、MPix/s、GFLOPS、Mbutterfly/s 和 MLUPS,所有项目均为数值越高越好。
- CPU 核心下拉框会在系统允许时显示该核心的最高频率;读取不到频率不影响 affinity 绑定。
- v2.0 参考值使用 Ryzen 7 9700X、Windows、MSVC
/O2的单核实测值取整固定;只应比较相同应用版本和设置的结果。
- 使用真机,不要使用模拟器评估手机硬件性能。
- 关闭省电模式并清理后台负载,等待手机降温后再测试。
- 每组设置运行三次并取中位数,跨设备对比时保持数据量和环境一致。
- 闪存测试会产生真实写入,不建议长期连续循环;至少预留 1 GiB 可用空间。
- 大数据量耗时更长,但更不容易被缓存和短时突发性能影响。
- Android Gradle Plugin 9.3.0 / Gradle 9.5.0
- Android 16 QPR2 SDK(API 36.1),最低 Android 8.0(API 26)
- NDK 30.0.15729638 / CMake 4.1.2
- APK ABI:仅
arm64-v8a
windows/CpuBenchmark 使用与 Android CPU 测试相同的 C++ 工作负载,便于在
Windows 电脑上运行后与手机结果对比。构建方法见该目录内的 README。
仓库不包含作者的正式签名密钥。普通开发者可直接构建 Debug APK;如需生成自己的
签名版本,请复制 release-signing/keystore.properties.example 为
release-signing/keystore.properties,再填写自己的 JKS 路径与密码。
本项目采用 Apache License 2.0,详见 LICENSE。