程序性能(1)嵌入式基准测试工具

程序性能(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基准测试的步骤:

  1. 下载CoreMark源代码,官网Release Tag of official release v1.01 from 2009 · eembc/coremark。
  2. 根据目标平台修改配置文件core_portme.h和core_portme.c,配置时钟频率、迭代次数、打印选项等,实现三个关键函数:开始测试、结束测试和时间计数。
  3. 编译源文件生成可执行程序。
  4. 运行程序,测试过程中会打印迭代进度。
  5. 测试完成后输出运行时间、迭代次数和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性能表现不错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ArrayList的subList的数据仍是集合

ArrayList的subList结果不可强转成ArrayList,否则会抛出 ClassCastException异常 • 级别: 【CRITICAL】 • 规约类型:BUG • 最坏影响: 程序错误,抛出异常 说明:subList 返回的是ArrayList的内部类SubL…

Notepad++中将文档格式从Windows(CR LF)转换为Unix(LF)

在Windows中用记事本写了一个.sh的Linux运行脚本,是无法直接在Linux中执行,需要首先把文本编码格式转换为Unix的,特别是换行符这些,转换步骤如下: 1、打开文档 在Notepad中打开需要转换的文件。 2、进入文档格式转换…

使用Ingress发布应用程序

使用Ingress发布应用程序 文章目录 使用Ingress发布应用程序[toc]一、什么是Ingress二、定义Ingress三、什么是Ingress控制器四、部署nginx Ingress控制器1.了解nginx Ingress控制器的部署方式2.安装nginx Ingress控制器3.本地实际测试 五、使用Ingress对外发布应用程序1.使用D…

【网络编程】TCP数据流套接字编程

目录 一. TCP API 二. TCP回显服务器-客户端 1. 服务器 2. 客户端 3. 服务端-客户端工作流程 4. 服务器优化 TCP数据流套接字编程是一种基于有连接协议的网络通信方式 一. TCP API 在TCP编程中,主要使用两个核心类ServerSocket 和 Socket ServerSocket Ser…

力扣刷题Day 21:两数之和(1)

1.题目描述 2.思路 暴力解法虽然不超时间限制,但是题解实在太妙了,哈希大法好! 3.代码(Python3) class Solution:def twoSum(self, nums: List[int], target: int) -> List[int]:hash_table dict()for i, num i…

关于UE5的抗锯齿和TAA

关于闪烁和不稳定现象的详细解释 当您关闭抗锯齿技术时,场景中会出现严重的闪烁和不稳定现象,尤其在有细节纹理和小物体的场景中。这种现象的技术原因如下: 像素采样问题 在3D渲染中,每个像素只能表示一个颜色值,但…

【MySQL】MySQL建立索引不知道注意什么?

基本原则: 1.选择性原则: 选择高选择性的列建立索引(该列有大量不同的值) 2.适度原则:不是越多越好,每个索引都会增加写入开销 列选择注意事项: 1.常用查询条件列:WHERE字句中频繁使用的列 2.连接操作列…

Vue3 + TypeScript中provide和inject的用法示例

基础写法&#xff08;类型安全&#xff09; typescript // parent.component.vue import { provide, ref } from vue import type { InjectionKey } from vue// 1. 定义类型化的 InjectionKey const COUNTER_KEY Symbol() as InjectionKey<number> const USER_KEY Sy…

树莓派超全系列教程文档--(33)树莓派启动选项

树莓派启动选项 启动选项start_file &#xff0c;fixup_filecmdlinekernelarm_64bitramfsfileramfsaddrinitramfsauto_initramfsdisable_poe_fandisable_splashenable_uartforce_eeprom_reados_prefixotg_mode &#xff08;仅限Raspberry Pi 4&#xff09;overlay_prefix配置属…

java怎么找bug?Arthas原理与实战指南

Arthas原理与实战指南 1. Arthas简介 Arthas是阿里巴巴开源的Java诊断工具&#xff0c;其名字取自《魔兽世界》的人物阿尔萨斯。它面向线上问题定位&#xff0c;被广泛应用于性能分析、定位问题、安全审计等场景。Arthas的核心价值在于它能够在不修改应用代码、不重启Java进程…

Python自学第1天:变量,打印,类型转化

突然想学Python了。经过Deepseek的推荐&#xff0c;下载了一个Python3.12安装。安装过程请自行搜索。 乖乖从最基础的学起来&#xff0c;废话不说了&#xff0c;上链接&#xff0c;呃&#xff0c;打错了&#xff0c;上知识点。 变量的定义 # 定义一个整数类型的变量 age 10#…

基于STM32中断讲解

基于STM32中断讲解 一、NVIC讲解 简介&#xff1a;当一个中断请求到达时&#xff0c;NVIC会确定其优先级并决定是否应该中断当前执行的程序&#xff0c;以便及时响应和处理该中断请求。这种设计有助于提高系统的响应速度和可靠性&#xff0c;特别是在需要处理大量中断请求的实…

游戏盾和高防ip有什么区别

游戏盾和高防IP都是针对网络攻击的防护方案&#xff0c;但​​核心目标、技术侧重点和应用场景存在显著差异​​。以下是两者的详细对比分析&#xff1a; ​​一、核心定位与目标​​ ​​维度​​​​高防IP​​​​游戏盾​​​​核心目标​​抵御大流量网络攻击&#xff08…

Spark-SQL3

Spark-SQL 一.Spark-SQL核心编程&#xff08;四&#xff09; 1.数据加载与保存&#xff1a; 1&#xff09;通用方式&#xff1a; SparkSQL 提供了通用的保存数据和数据加载的方式。这里的通用指的是使用相同的API&#xff0c;根据不同的参数读取和保存不同格式的数据&#…

DeepSeek与Napkin:信息可视化领域的创新利器

摘要 在数字化信息爆炸的时代&#xff0c;如何高效地组织思路并将其转化为直观、清晰的可视化图表&#xff0c;成为众多领域面临的关键问题。本文深入剖析了DeepSeek与Napkin这两款工具&#xff0c;详细探讨它们在信息处理与可视化过程中的功能特性、协同工作机制、应用场景、…

conda 创建、激活、退出、删除环境命令

参考博客&#xff1a;Anaconda创建环境、删除环境、激活环境、退出环境 使用起来觉得有些不方便可以改进&#xff0c;故写此文。 1. 创建环境 使用 -y 跳过确认 conda create -n 你的环境名 -y 也可以直接选择特定版本 python 安装&#xff0c;以 3.10 为例&#xff1a; co…

嵌入式芯片中的 低功耗模式 内容细讲

电源域与运行级别概述 电源域&#xff08;Power Domain&#xff09; 核心域&#xff08;Core Domain&#xff09;&#xff1a;包括 CPU 核心和关键架构模块&#xff08;如 NVIC、CPU 内核寄存器&#xff09;。 外设域&#xff08;Peripheral Domain&#xff09;&#xff1a;…

Java中常见的锁synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock

在Java中&#xff0c;锁是实现多线程同步的核心机制。不同的锁适用于不同的场景&#xff0c;理解其实现原理和使用方法对优化性能和避免并发问题至关重要。 一、隐式锁&#xff1a;synchronized 关键字 实现原理 基于对象监视器&#xff08;Monitor&#xff09;&#xff1a;每…

@JsonView + 单一 DTO:如何实现多场景 JSON 字段动态渲染

JsonView 单一 DTO&#xff1a;如何实现多场景 JSON 字段动态渲染 JsonView 单一 DTO&#xff1a;如何实现多场景 JSON 字段动态渲染1、JsonView 注解产生的背景2、为了满足不同场景下返回对应的属性的做法有哪些&#xff1f;2.1 最快速的实现则是针对不同场景新建不同的 DTO…

Etcd 压缩整理

etcd数据存储 在实际生产中使用 ETCD 存储元数据&#xff0c;起初集群规模不大的时候元数据信息不多没有发现什么问题。随着集群规模越来越大&#xff0c;可能引发存储问题。 —auto-compaction-retention 由于ETCD数据存储多版本数据&#xff0c;随着写入的主键增加历史版本需…