Dhrystone基准测试程序在Google Pixel4上运行跑分教程

article/2025/9/21 22:52:43

记录一下实验过程,方便后续回顾

一、Dhrystone简介

Dhrystone是测量处理器运算能力的最常见基准程序之一,常用于处理器的整型运算性能的测量。程序是用C语言编写的,因此C编译器的编译效率对测试结果也有很大影响。

但其也有许多不足,Dhrystone不仅不适合于作为嵌入式系统的测试向量,甚至在其大多数场合下都不适合进行应用。Dhrystone还有许多漏洞,例如:易被非法利用、人为痕迹明显、代码长度太短、缺乏验证及标准的运行规则等。该程序是用C编写的,容易受到编译器影响,不同优化选项下,测试的性能并不一致。代码量小,在现代CPU中,它能够被放进指令缓存中,所以它并不能严格的测量取指性能。

Dhrystone标准的测试方法很简单,就是单位时间内跑了多少次Dhrystone程序,其指标单位为DMIPS/MHz。MIPS是Million Instructions Per Second的缩写,每秒处理的百万级的机器语言指令数。DMIPS中的D是Dhrystone的缩写,它表示了在Dhrystone标准的测试方法下的MIPS。

关于DMIPS有一个不得不注意的点,因为历史原因我们把在VAX-11/780机器上的测试结果1757 Dhrystones/s定义为1 DMIPS,因此在其他平台测试到的每秒Dhrystones数应除以1757,才是真正的DMIPS数值,故DMIPS其实表示的是一个相对值。

二、源码

可以直接移植官方版本的,但是如果移植官方的会有比较多的错误。
比如:

  • 常见C库函数的重定义(malloc等)
  • 没有包含使用到的C库的头文件
  • 一些系统定义的变量,如系统中断HZ变量没有包含
  • 函数没有声明等

网上有多个版本的,这里使用的是包含dry.h、dry1.c和dry2.c的源码。并且该版本修复了一些已知的错误。基于dhrystone2.2版本
https://github.com/iwannatto/dhrystone

三、编译

1.修改Makefile文件

需要做的就是简单修改Makefile文件即可编译代码:设置交叉工具链、把一些没有要的代码注释掉,下面是我简单修改后的Makefile文件。

注意:CTOOL:=arm-linux-gnueabi- 和 CCL:=/usr 要修改为自己的安装路径
安装32位gcc编译器 sudo apt-get install gcc-arm-linux-gnueabi

.PHONY: run clean
# Set compilation tool chain
CTOOL:=arm-linux-gnueabi-
CCL:=/usr
CC:=${CCL}/bin/${CTOOL}gcc
CFLAGS=-O3run: dry2 dry2nr dry2o
#	./dry2 ${1-50000} 2>/dev/null
#	./dry2nr ${1-50000} 2>/dev/null
#	./dry2o ${1-50000} 2>/dev/nulldry2: dry.h dry1.c dry2.c${CC} -c ${CFLAGS} dry1.c -o dry1.o -static${CC} ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2 -staticdry2nr: dry.h dry1.c dry2.c${CC} -c -DREG ${CFLAGS} dry1.c -o dry1.o -static${CC} -DREG ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2nr -staticdry2o: dry.h dry1.c dry2.c${CC} -c -O ${CFLAGS} dry1.c -o dry1.o -static${CC} -O ${CFLAGS} dry2.c dry1.o ${LFLAGS} -o dry2o -staticclean:rm -f dry1.o dry2 dry2nr dry2o

使用make进行编译,多线程make -j8,这里可以根据电脑实际配置修改,不加-j也很快。

ps:其他编译方式

cc编译
cc -c  dry.c -o dry1.o
cc -DPASS2  dry.c dry1.o  -o dry2gcc编译
gcc -c  dry.c -o dry1.o
gcc -DPASS2  dry.c dry1.o  -o dry2sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install gcc-aarch64-linux-gnuarm32位编译(使用32位编译)
arm-linux-gnueabi-gcc -c  dry.c -o dry1.o
arm-linux-gnueabi-gcc -DPASS2  dry.c dry1.o  -o dry2 -staticarm64位编译
aarch64-linux-gnu-gcc -c  dry.c -o dry1.o
aarch64-linux-gnu-gcc -DPASS2  dry.c dry1.o  -o dry2 -static

通过上一步编译得到三个可执行文件,分别是dry2、dry2nr、dry2o

这三个文件的区别就是编译的时候使用了不同的参数。

在这里插入图片描述
dry2:普通的编译
dry2nr:编译加了-DREG
dry2o:编译添加了-O,优化了代码

四、运行

要运行在手机上,需要通过adb将编译得到的可执行程序push到手机上。然后给其增加权限。
我这里把一整个文件夹都传过来了。

adb push D:\xxx\Dry /data/local/tmp
chmod 777 dry2 dry2nr dry2o

通过adb shell进入文件系统,找到可执行程序,直接运行即可。

flame:/data/local/tmp/Dry # ./dry2oDhrystone Benchmark, Version C, Version 2.2
Program compiled without 'register' attribute
Using times(), HZ=100Trying 50000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 500000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 5000000 runs through Dhrystone:
Measured time too small to obtain meaningful resultsTrying 50000000 runs through Dhrystone:
Final values of the variables used in the benchmark:Int_Glob:            5should be:   5
Bool_Glob:           1should be:   1
Ch_1_Glob:           Ashould be:   A
Ch_2_Glob:           Bshould be:   B
Arr_1_Glob[8]:       7should be:   7
Arr_2_Glob[8][7]:    50000010should be:   Number_Of_Runs + 10
Ptr_Glob->Ptr_Comp:          0x83e360should be:   (implementation-dependent)Discr:             0should be:   0Enum_Comp:         2should be:   2Int_Comp:          17should be:   17Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Next_Ptr_Glob->Ptr_Comp:          0x83e360should be:   (implementation-dependent), same as aboveDiscr:             0should be:   0Enum_Comp:         1should be:   1Int_Comp:          18should be:   18Str_Comp:          DHRYSTONE PROGRAM, SOME STRINGshould be:   DHRYSTONE PROGRAM, SOME STRING
Int_1_Loc:           5should be:   5
Int_2_Loc:           13should be:   13
Int_3_Loc:           7should be:   7
Enum_Loc:            1should be:   1
Str_1_Loc:           DHRYSTONE PROGRAM, 1'ST STRINGshould be:   DHRYSTONE PROGRAM, 1'ST STRING
Str_2_Loc:           DHRYSTONE PROGRAM, 2'ND STRINGshould be:   DHRYSTONE PROGRAM, 2'ND STRINGMicroseconds for one run through Dhrystone:        0.0
Dhrystones per Second:                        24271844

最后的得分就是:24271844/1757/xxMHz


http://chatgpt.dhexx.cn/article/8T6AvhWL.shtml

相关文章

痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(2)- RT685EVKA性能实测(Dhrystone)...

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的性能。 在前面的文章 i.MXRTxxx微控制器概览 里,痞子衡给大家简介过恩智浦半导体在2018年推出的全新跨界微控制器i.MX RTxxx系列,该系列…

三.N32G003 系统性能测试--dhrystone (IAR环境)

三.N32G003 系统性能测试–dhrystone (IAR环境) 3.IAR 环境下测试结果 3.1 优化等级区别 3.2 FALSH 时延参数区别 3.3 KEIL测试数据 Microseconds for one run through Dhrystone: 50 Dhrystones per Second: 20000 VAX MIPS rating: …

dhrystone和coremark测试比较

关于dhrystone测试,请参考博客 Dhrystone DMIPS跑分原理以及CPU&NPU等效算力分析_papaofdoudou的博客-CSDN博客_dhrystone测试结果怎么看 比较 coremark环境搭建 caozilongcaozilong-Vostro-3268:~/Workspace/coremark$ git clone https://gitcode.net/mirro…

Lichee_RV学习系列---移植dhrystone

Lichee_RV学习系列文章目录 Lichee_RV学习系列—认识Lichee_RV、环境搭建和编译第一个程序 文章目录 Lichee_RV学习系列文章目录一、dhrystone简介二、dhrystone源码下载三、dhrystone移植1、移植官方源码2、移植GitHub开源代码a:修改Makefile文件b:编译…

痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone。 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone、MIPS、CoreMark,其中Dhrystone是一种古老的却历时30年而不衰的嵌入式系统处理器测试基准,至今仍为…

浅谈HashMap 的底层原理

本文整理自漫画:什么是HashMap? -小灰的文章 。已获得作者授权。 HashMap 是一个用于存储Key-Value 键值对的集合,每一个键值对也叫做Entry。这些个Entry 分散存储在一个数组当中,这个数组就是HashMap 的主干。 HashMap 数组每一个元素的初…

HashMap底层原理与面试题

文章目录 1 类图2 属性2.1 常见属性介绍2.2 底层数据结构2.3 重要常量2.4 链表和树的问题1 为什么不直接采用红黑树?2 为什么采用红黑树,而不是AVL平衡树? 3 构造器3.1 常用构造器 4 put方法4.1 put操作的整体思路4.2 树操作(略&a…

HashMap底层原理全解析

作为面试中的高频题目&#xff0c;我相信每一个java程序员都有必要搞懂HashMap的底层原理和实现细节&#xff0c;废话不多说直接开撸。 首先简单说一下HashMap的实现原理&#xff1a; 首先有一个Node<k,v>类型的数组&#xff0c;当添加一个键值对(key-value)时&#xf…

HashMap 底层原理///HashMap详解

HashMap超详细探讨 总述从集合出发探讨HashMapCollection接口继承树Map接口继承树 从Map接口来&#xff0c;一步一步深入其中Map接口概述Map接口&#xff1a;常用方法Map接口 Map实现类之一&#xff1a;HashMapHashMap的存储结构HashMap源码中的重要常量JDK 1.8之前JDK 1.8总结…

HashMap底层原理(图文并茂,简单易懂)

大家先看下这张图片&#xff1a; 1、HashMap是基于哈希表实现的&#xff0c;而哈希表的底层是数组加上链表的形式。 2、数组内存连续查询效率高&#xff0c;链表内存分散增删改效率高&#xff0c;哈希表采用此种存储数据的形式极大的提高操作数据的效率。 3、哈希表的默认长…

HashMap底层数据结构

HashMap集合&#xff1a; 底层是哈希表/散列表的数据结构 HashMap集合&#xff1a;1、HashMap集合底层是哈希表/散列表的数据结构。2、哈希表是一个怎样的数据结构呢&#xff1f;哈希表是一个数组和单向链表的结合体。数组&#xff1a;在查询方面效率很高&#xff0c;随机增删方…

HashMap底层数据结构(数组+链表+红黑树)

回顾一下HashMap的底层数据结构 HashMap底层实现JDK<1.7数组链表&#xff0c;JDK>1.8数组链表红黑树&#xff1b;HashMap这一个类型底层涉及到3中数据类型&#xff0c;数组、链表、红黑树&#xff0c;其中查询速度最快的是数组&#xff0c;时间复杂度是O(1),链表数据量少…

Java HashMap底层实现

HashMap 是 Java 使用频率最高的用于映射&#xff08;键值对&#xff09;处理的数据类型。JDK1.8 对 HashMap 底层的实现进行了优化&#xff0c;例如引入红黑树的数据结构和扩容的优化等。在JDK1.8以前HashMap是由数组链表的数据结构组成的。 Java为数据结构中的映射定义了一个…

java----hashmap底层原理

概述 在Java集合中&#xff0c;Map是一种特殊的集合&#xff0c;原因在于这种集合容器并不是保存单个元素&#xff0c;而是保存一个一个的Key-Vaue键值对.HashMap是基于哈希表的Map接口的实现,在项目开发中使用广泛,下面就对HashMap的源码进行解析. Hashmap的特点 1.HashMap…

HashMap底层数据结构详解

一、HashMap底层数据结构 JDK1.7及之前&#xff1a;数组链表JDK1.8&#xff1a;数组链表红黑树 关于HashMap基本的大家都知道&#xff0c;但是为什么数组的长度必须是2的指数次幂&#xff0c;为什么HashMap的加载因子要设置为0.75&#xff0c;为什么链表长度大于等于8时转成了…

复习一波HashMap底层实现原理解析

HashMap是JAVA中最常见的集合类框架&#xff0c;也是java语言中非常典型的数据结构&#xff0c;同时也是我们需要掌握的数据结构&#xff0c;更重要的也是面试题必问之一。 我们常见的有集合数据有三种结构&#xff1a;1、数组结构 2、链表结构 3、哈希表结构 下面我们来看看各…

HashMap的底层实现

1. HashMap概述&#xff1a; HashMap是基于哈希表的Map接口的非同步实现&#xff08;Hashtable跟HashMap很像&#xff0c;唯一的区别是Hashtalbe中的方法是线程安全的&#xff0c;也就是同步的&#xff09;。此实现提供所有可选的映射操作&#xff0c;并允许使用null值和null键…

HashMap底层特性全解析

文章目录 一、前言二、HashMap2.1 HashMap数据结构2.2 HashMap线程不安全2.3 哈希冲突 三、JDK1.7中HashMap的实现3.1 基本元素Entry3.2 插入逻辑3.2.1 插入逻辑3.2.2 新建节点添加到链表 3.3 数组扩容逻辑3.4 null处理3.5 辨析扩容、树化和哈希冲突 四、JDK1.8中HashMap的实现…

HashMap底层

1、HashMap底层数据结构 JDK1.7的底层是 数组链表&#xff1b; JDK1.8之后 数组 链表 红黑树&#xff1b; 数组特点&#xff1a;具有随机访问的特点&#xff0c;能达到O(1)的时间复杂度&#xff0c;数组查询快&#xff0c;增删比较麻烦&#xff1b; 链表特点&#xff1a;…

HashMap底层实现和原理(源码解析)

Note&#xff1a;文章的内容基于JDK1.7进行分析&#xff0c;1.8做的改动文章末尾进行讲解。 大家可以看一下:https://www.imooc.com/article/267756 一、先来熟悉一下我们常用的HashMap 1、概述 HashMap基于Map接口实现&#xff0c;元素以键值对的方式存储&#xff0c;并且…