程序性能(1)嵌入式基准测试工具
Author:Once Day date: 2025年4月19日
漫漫长路,才刚刚开始…
全系列文档查看:Perf性能分析_Once-Day的博客-CSDN博客
参考文档:
- CPU Benchmark – MCU Benchmark – CoreMark – EEMBC Embedded Microprocessor Benchmark Consortium
- CPU性能测试——CoreMark篇 - Imagine_Miracle - 博客园
- Iozone Filesystem Benchmark
- iozone磁盘读写测试工具的使用以及命令详解、下载(网站最详细讲解步骤)_iozone参数详解-CSDN博客
- RAMspeed SMP Benchmark - OpenBenchmarking.org
文章目录
- 程序性能(1)嵌入式基准测试工具
- 1. 通用嵌入式基准测试工具
- 2. CoreMark使用
- 3. IOzone 使用
1. 通用嵌入式基准测试工具
在嵌入式设备开发中,进行 CPU、IO 和内存的基准测试(Benchmark) 是评估系统性能的重要手段。以下是一些常用的基准测试工具,适用于不同的嵌入式平台(如 ARM Cortex 系列、RISC-V、MIPS 等):
(1)CoreMark
- 测试内容:CPU性能(整数运算、控制流、内存访问等)
- 优点:专为嵌入式系统设计,小巧、无需操作系统
- 平台支持:几乎所有架构(ARM、RISC-V、MIPS 等)
CoreMark 是 EEMBC 推出的最常用嵌入式 CPU benchmark,常用于芯片厂商性能对比。
(2)Dhrystone
- 测试内容:整数运算性能、控制结构等
- 适用场景:无需浮点运算的 CPU 基准测试
- 优点:代码简单、移植性好
- 缺点:已较老旧,不代表现代应用性能
(3)Linpack (嵌入式版本)
- 测试内容:浮点性能(FLOPS)
- 适用场景:带有 FPU 的嵌入式处理器
- 说明:需要设备支持浮点运算,否则会测试失败
(4)IOzone (嵌入式 Linux 下)
- 测试内容:文件系统 IO 性能(读取、写入、随机访问等)
- 适用平台:嵌入式 Linux(如 Yocto、Buildroot)
# 示例:测试写入性能
iozone -a -g 64M -i 0 -i 1 -i 2
(5)dd 命令
- 测试内容:原始读写速度
- 适用平台:Linux/Unix 系统
# 写入测试
dd if=/dev/zero of=testfile bs=1M count=100 oflag=direct# 读取测试
dd if=testfile of=/dev/null bs=1M count=100 iflag=direct
(6)RAMspeed / RAMbench
- 测试内容:内存读写速度、带宽
- 适用平台:带 Linux 的嵌入式系统
# RAM 带宽测试(整数)
ramspeed -b int# RAM 带宽测试(浮点)
ramspeed -b float
工具选择建议:
需求类型 | 推荐工具 | 是否需要操作系统 |
---|---|---|
CPU(整数) | CoreMark, Dhrystone | 否 / 任意 |
CPU(浮点) | Linpack | 否 / 任意 |
IO 性能 | IOzone, dd | 是(Linux) |
内存带宽/延迟 | RAMspeed | 是(Linux) |
2. CoreMark使用
CoreMark是一个开源的处理器基准测试程序,用于评估处理器的性能。它由EEMBC(Embedded Microprocessor Benchmark Consortium)开发,测试内容包括常见的处理器操作,如整数运算、矩阵操作、状态机等,通过运行一系列测试并计算总分来衡量处理器性能。
CoreMark的主要特点:
- 开源免费,代码简洁,可移植性强,方便在不同平台上使用。
- 测试内容覆盖常见处理器操作,结果具有一定代表性。
- 计算量适中,可在各类处理器上运行,从低端单片机到高端应用处理器。
- 测试结果单位为CoreMark/MHz,便于跨平台比较。
使用CoreMark基准测试的步骤:
- 下载CoreMark源代码,官网Release Tag of official release v1.01 from 2009 · eembc/coremark。
- 根据目标平台修改配置文件core_portme.h和core_portme.c,配置时钟频率、迭代次数、打印选项等,实现三个关键函数:开始测试、结束测试和时间计数。
- 编译源文件生成可执行程序。
- 运行程序,测试过程中会打印迭代进度。
- 测试完成后输出运行时间、迭代次数和CoreMark得分。
在linux环境下测试比较简单,修改linux64/core_portme.mak
文件即可:
...
# 注释掉,利用环境变量传递编译器
# CC = gcc
...
# 添加环境变量的CFLAGS
PORT_CFLAGS := -O2 $(CFLAGS)
...
# 添加环境变量的LDFLAGS
LFLAGS_END += $(LDFLAGS) -lrt
...
使用make compile PORT_DIR=linux64
直接编译目标二进制文件,拷贝到设备上运行即可。
root@90cfc5ecd444:~/workspace/packages/coremark-1.01# cat run1.log
2K performance run parameters for coremark.
CoreMark Size : 666
Total ticks : 14154
Total time (secs): 14.154000
Iterations/Sec : 28260.562385
Iterations : 400000
Compiler version : GCC13.3.0
Compiler flags : -O2 -DPERFORMANCE_RUN=1 -lrt
Memory location : Please put data memory location here(e.g. code in flash, data on heap etc)
seedcrc : 0xe9f5
[0]crclist : 0xe714
[0]crcmatrix : 0x1fd7
[0]crcstate : 0x8e3a
[0]crcfinal : 0x65c5
Correct operation validated. See readme.txt for run and reporting rules.
CoreMark 1.0 : 28260.562385 / GCC13.3.0 -O2 -DPERFORMANCE_RUN=1 -lrt / Heap
运行参数:CoreMark大小为666字节,运行400000次迭代,编译器版本为GCC 13.3.0。
编译器参数为-O2 -DPERFORMANCE_RUN=1 -lrt
,其中-O2
表示优化等级为2,-DPERFORMANCE_RUN=1
表示定义了性能运行宏,启用了性能测试模式,-lrt
表示链接了实时库。内存位置为堆(Heap)。
运行结果:
- 总计运行了14154个ticks(时钟周期)。
- 总运行时间为14.154秒。
- 每秒迭代次数为28260.562385次。
- 完成了400000次迭代。
- CRC校验结果正确,分别给出了list、matrix、state和final的CRC值。
CoreMark得分为28260.562385,即每兆赫运行28260.562385次迭代。
3. IOzone 使用
IOZone是一个广泛使用的文件系统基准测试工具,用于测试不同操作系统下文件系统的性能。它可以测试读、写、重读、重写等多种操作,从而全面评估文件系统的I/O性能。下面介绍如何在嵌入式设备上使用IOZone进行性能测试:
在嵌入式设备上安装IOZone。可以从官网下载源码编译,也可以使用已编译好的二进制文件。将IOZone拷贝到嵌入式设备的文件系统中。
基本用法是:
iozone -a [-s filesize] [-r recordsize] [-f pathname]
-a
自动测试模式,会自行运行全部的测试,也可以通过-i
运行指定的测试用例。-s
指定测试文件的大小,单位为KB。建议设置为可用内存的2倍,以免影响结果。-r
指定记录大小,单位为KB。记录大小会影响I/O性能。-f
指定测试文件的路径。
例如:
测试参数:记录大小(Record Size)为16384 kB,即16MB。文件大小(File size)设置为8388608 kB,即8GB。-a
表示自动模式,测试全部操作,-f
指定测试文件路径,-r
设置记录大小为16MB,-s
设置文件大小为8GB。
处理器缓存大小设置为1024 kB,处理器缓存行大小设置为32字节,文件Stride大小设置为记录大小的17倍。
测试结果的单位为kBytes/sec,即每秒传输的KB数。每一列代表一项测试指标:
- write: 1106269 kB/s,顺序写性能。
- rewrite: 1324957 kB/s,顺序重写性能。
- read: 1597475 kB/s,顺序读性能。
- reread: 1599842 kB/s,顺序重读性能。
- random read: 1782057 kB/s,随机读性能。
- random write: 1361914 kB/s,随机写性能。
- bkwd read: 1678651 kB/s,倒序读性能。
- record rewrite: 3534785 kB/s,记录重写性能。
- stride read: 1791199 kB/s,跳跃读性能。
- fwrite: 1306302 kB/s,文件写性能。
- frewrite: 1272293 kB/s,文件重写性能。
- fread: 1620173 kB/s,文件读性能。
- freread: 1625551 kB/s,文件重读性能。
d rewrite: 3534785 kB/s,记录重写性能。
- stride read: 1791199 kB/s,跳跃读性能。
- fwrite: 1306302 kB/s,文件写性能。
- frewrite: 1272293 kB/s,文件重写性能。
- fread: 1620173 kB/s,文件读性能。
- freread: 1625551 kB/s,文件重读性能。
可以看出,该设备顺序读写性能在1.1-1.5 GB/s左右,随机读写略高一些,达到了1.3~1.7 GB/s。倒序读和跳跃读也有接近1.7 GB/s的表现。记录重写和文件读写的速度也都在1.2 GB/s以上,整体I/O性能表现不错。