程序性能(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性能表現不錯。