ARM64 Windows 10 IoT工控主板运行x86程序效率测试

        ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM8400上运行。

        下会将编写一个小程序,分别构建成x86ARM64格式来测试其运行效率。所设计的测试程序代码如下,其中的TestSmp函数有两个输入参数,第一参数表示要创建测试线程的数量,第二个参数为所创建线程的运行时长。cbTestSmp是被创建的测试线程,测试线程主要是在一个while循环中,反复读取内存变量然后与预设值进行比较,在运行设定的时间后自动退出循环,其中的threadParam->loops变量会记录下while循环总共执行的次数。

typedef struct _SMP_THREAD_PARAM
{UINT32 durationMs;UINT32 cpuId;UINT64 loops;BOOL   bSetAffinity;UINT32 sandBoxSize;LPVOID sandBoxStart;
}SMP_THREAD_PARAM, * PSMP_THREAD_PARAM;DWORD WINAPI cbTestSmp(LPVOID param)
{PSMP_THREAD_PARAM threadParam = (PSMP_THREAD_PARAM)param;DWORD tStart = GetTickCount();UINT8* buffer = (UINT8*)threadParam->sandBoxStart;wprintf(L"Ahou, Thread %d, running for %d ms\r\n", threadParam->cpuId, threadParam->durationMs);// Write to sandboxfor (UINT32 i = 0; i < threadParam->sandBoxSize; i++){buffer[i] = (UINT8)(i);// * (UINT32)threadParam->loops);}while ((GetTickCount() - tStart) < threadParam->durationMs){// Read back from sandboxfor (UINT32 i = 0; i < threadParam->sandBoxSize; i++){//if (buffer[i] != (UINT8)(i * (UINT32)threadParam->loops) )if (buffer[i] != (UINT8)(i))// * (UINT32)threadParam->loops) ){wprintf(L"Thread %d : error at byte %d for loop %I64d !!\r\n",threadParam->cpuId, i, threadParam->loops);}}threadParam->loops++;}wprintf(L"Thread %d : terminating\r\n", threadParam->cpuId);return 0;
}void TestSmp(UINT32 nCpus, UINT32 durationMs)
{UINT32 i;PSMP_THREAD_PARAM threadParams;HANDLE* threadHandles;UINT64 totalLoops = 0;UINT32 sandBoxSize = 1024 * 128; // 128 kBHANDLE h_array[1];threadParams = (PSMP_THREAD_PARAM)malloc(nCpus * sizeof(SMP_THREAD_PARAM));if (threadParams == NULL){wprintf(L"Failed allocating thread params !\r\n");return;}threadHandles = (HANDLE*)malloc(nCpus * sizeof(HANDLE));if (threadHandles == NULL){wprintf(L"Failed allocating thread handles !\r\n");return;}for (i = 0; i < nCpus; i++){threadParams[i].bSetAffinity = TRUE;threadParams[i].cpuId = i;threadParams[i].durationMs = durationMs;threadParams[i].loops = 0;threadParams[i].sandBoxSize = sandBoxSize;threadParams[i].sandBoxStart = malloc(sandBoxSize);threadHandles[i] = CreateThread(NULL, 0, cbTestSmp, &threadParams[i], 0, NULL);wprintf(L"Thread handle %d : 0x%x\r\n", i, threadHandles[i]);}h_array[0] = threadHandles[0];DWORD res = WaitForSingleObject(h_array[0], INFINITE);Sleep(500);if (res == WAIT_TIMEOUT){wprintf(L"Timeout waiting for threads !\r\n");}else{wprintf(L"All threads exited\r\n");}for (i = 0; i < nCpus; i++){wprintf(L"Thread %d did run %I64d loops\r\n", i, threadParams[i].loops);totalLoops += threadParams[i].loops;free(threadParams[i].sandBoxStart);CloseHandle(threadHandles[i]);}wprintf(L"Total number of loops %I64d (%I64d millions)\r\n", totalLoops, totalLoops / 1000000);free(threadHandles);free(threadParams);
}

        将上述代码分别编译构建成x86格式和ARM64模式,设置while循环执行10000ms,在ESM8400上的测试结果如下:

ESM8400 Win10 ARM工控主板运行x86和ARM64程序效率对比

        可以看到相同的代码,构建成本机ARM64格式的运行效率是x86格式的2.2倍以上。

        基于微软系统以及其开发工具良好的兼容性,我很容易做了另一个对比实验,将上述代码不经修改直接在VS2008中编译成WEC7应用程序,在英创的几款WEC7工控主板上做了同样的测试,测试结果如下:

        ESM3354是英创10年前推出的第一款预装WEC7的工控主板,主CPU采用了TI的单核Cortex-A8芯片——AM3354,ESM3354目前仍在批量供货。而安装Windows 10 IoT的ESM8400工控主板,主CPU为NXP的i.MX8M Plus四核Cortex-A53,与10年前的ESM3354相比,ESM8400的性能有超过10倍的提升。

         ARM上的 Windows IoT 企业版可以让习惯使用 x86/x64 的设备开发人员快速进行软件开发,大多数适用于 Windows IoT 企业版的文档都适用于 ARM64 x86/x64。通过仿真技术,ARM上的 Windows IoT可按原样运行x86/x64程序而无需修改,而直接构建本机ARM64应用程序能获得最佳的性能、响应能力和能耗。

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

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

相关文章

万里数据库GreatSQL监控解析

GreatSQL是MySQL的一个分支&#xff0c;专注于提升MGR&#xff08;MySQL Group Replication&#xff09;的可靠性及性能。乐维监控平台可以有效地监控GreatSQL&#xff0c;帮助用户及时发现并解决潜在的性能问题。 通过在GreatSQL服务器上安装监控代理&#xff0c;收集数据库性…

【贪心算法】贪心算法七

贪心算法七 1.整数替换2.俄罗斯套娃信封问题3.可被三整除的最大和4.距离相等的条形码5.重构字符串 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f…

四年匠心磨砺,快手系统软件技术创新与领域演进之路

一、系统软件技术的核心价值与面临挑战 系统软件作为软件架构的基石&#xff0c;扮演着连接软件与硬件的桥梁角色&#xff0c;位于整个软件生态的最底层&#xff0c;处于关键核心的位置。系统软件最为显著的特征在于其规模效应&#xff0c;随着服务器体量的增加&#xff0c;系…

使用JMeter对Linux生产服务器进行压力测试

安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言&#xff08;例如&#xff1a;Chinese&am…

Nginx1.20.2-Linux-安装

文章目录 1.下载压缩包1.官网下载2.找到1.20.23.百度网盘 2.Linux安装1.搭建gcc环境2.上传到 /usr/local/nginx1.20.23.解压1.解压到当前目录2.删除压缩包 4.配置Nginx的编译路径1.进入nginx-1.20.22.执行内部的脚本&#xff0c;指定编译路径为/usr/local/nginx 5.编译并安装6.…

常用的linux命令介绍

Linux是一个强大的操作系统&#xff0c;它提供了许多命令行工具来帮助用户管理文件和目录、监控系统性能、以及执行各种系统管理任务。下面是一些常用的Linux命令&#xff0c;我会用简单的语言来解释它们的作用&#xff1a; 1. ls • 作用&#xff1a;列出目录内容。 • 比喻&a…

linux--编译驱动模块【虚拟网卡 tun】

linux--编译驱动模块【虚拟网卡 tun】 1 介绍2 操作2.1 源码 linux-5.10.1602.2 安装控制台应用程序依赖库&#xff0c;其他库2.3 普通用户模式操作2.4 然后配置需要编译的模块2.5 关闭 preempt2.6 开启 bpf【未成功&#xff0c;放弃】2.7 编译模块报错处理一&#xff1a;缺少证…

前端超大缓存IndexDB、入门及实际使用

文章目录 往期回顾项目实战初始化表获取列表新增表的数据项获取详情根据ID获取详情根据其他字段获取详情 删除数据 总结 往期回顾 在之前的文章中&#xff0c;我们介绍了IndexDB vs Cookies vs Session这几个的对比&#xff0c;但是没有做实际项目的演示&#xff0c;今天我们用…

swiftui开发页面加载发送请求初始化@State变量

在SwiftUI中&#xff0c;你不能直接在init中更新State变量&#xff0c;因为State是由SwiftUI框架管理的&#xff0c;初始化时不允许直接修改。所以需要在onAppear发送请求然后修改State状态。 在SwiftUI中&#xff0c;如果希望在页面加载时立即发送网络请求&#xff0c;可以使…

OpenStack系列第四篇:云平台基础功能与操作(Dashboard)

文章目录 1. 镜像&#xff08;Image&#xff09;添加镜像查看镜像删除镜像 2. 卷&#xff08;Volume&#xff09;创建卷查看卷删除卷 3. 网络&#xff08;虚拟网络&#xff09;创建网络查看网络删除网络 4. 实例类型创建实例类型查看实例类型删除实例类型 4. 密钥对&#xff08…

3D数学基础2

矩阵的行列式 在任意方阵中都存在至少一个标量&#xff0c;称作该方阵的行列式。在线性代数中&#xff0c;行列式有很多有用的性质 线性运算法则 方阵 M M M的行列式记作 ∣ M ∣ |M| ∣M∣或“det M”。非方阵矩阵的行列式是未定义的。 注意&#xff0c;在书写行列式时&…

elementui的默认样式修改

今天用element ui &#xff0c;做了个消息提示&#xff0c;发现提示的位置总是在上面&#xff0c;如图&#xff1a; 可是我想让提示的位置到下面来&#xff0c;该怎么办&#xff1f; 最后还是看了官方的api 原来有个自定义样式属性 customClass 设置下就好了 js代码 css代码…

WebRTC:实现浏览器与移动应用的实时通信

1.技术简介 &#xff08;Web Real-Time&#xff09;是一种开放式实时通信技术&#xff0c;旨在使浏览器和移动应用程序通过简单的API即可实现实时音频、视频和数据传输&#xff0c;而无需安装插件或额外软件。它支持网络应用中的点对点通信&#xff0c;例如视频聊天、语音通话…

NVR小程序接入平台EasyNVR使用FFmpeg取流时提示错误是什么原因呢?

在视频监控系统中&#xff0c;FFmpeg常用于从各种源&#xff08;如摄像头、文件、网络流等&#xff09;获取流媒体数据&#xff0c;这个过程通常称为“取流”。 在EasyNVR平台中&#xff0c;使用FFmpeg取流是一种常见的操作。FFmpeg作为一款强大的开源多媒体处理工具&#xff…

NXP i.MX8系列平台开发讲解 - 5.4 调试篇 - 掌握perf 工具调试(一)

专栏文章目录传送门&#xff1a;返回专栏目录 Hi, 我是你们的老朋友&#xff0c;主要专注于嵌入式软件开发&#xff0c;有兴趣不要忘记点击关注【码思途远】 文章目录 目录 掌握perf 工具调试(一) 1. Perf 工具介绍 1.1 Perf 工作原理 1.2 Perf 工具基本功能 2. Perf 安…

实际部署Dify可能遇到的问题:忘记密码、开启HTTPS、知识库文档上传的大小限制和数量限制

背景 前面我们以 docker compose 容器化的方式本地部署了 Dify 社区版&#xff0c;并快速体验了其聊天助手、工作量编排以及智能体&#xff08;Agent&#xff09;功能。不过后续实际生产环境使用时遇到了忘记密码、如何开启SSL以支持HTTPS、如何突破知识库文档上传的大小限制和…

Python 青铜宝剑十六维,破医疗数智化难关(上)

一、医疗数智化困境剖析 在当今数智化浪潮的席卷下&#xff0c;医疗行业正经历着深刻变革&#xff0c;医疗数智化转型已成为不可阻挡的趋势。它将现代信息技术深度融入医疗的各个环节&#xff0c;从电子病历的广泛普及&#xff0c;实现医疗信息的便捷存储与快速查阅&#xff0…

Kafka 性能提升秘籍:涵盖配置、迁移与深度巡检的综合方案

文章目录 1.1.网络和io操作线程配置优化1.2.log数据文件刷盘策略1.3.日志保留策略配置1.4.replica复制配置1.5.配置jmx服务1.6.系统I/O参数优化1.6.1.网络性能优化1.6.2.常见痛点以及优化方案1.6.4.优化参数 1.7.版本升级1.8.数据迁移1.8.1.同集群broker之间迁移1.8.2.跨集群迁…

易基因: BS+ChIP-seq揭示DNA甲基化调控非编码RNA(VIM-AS1)抑制肿瘤侵袭性|Exp Mol Med

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 肝细胞癌&#xff08;hepatocellular carcinoma&#xff0c;HCC&#xff09;早期复发仍然是一个具有挑战性的领域&#xff0c;其中涉及的机制尚未完全被理解。尽管微血管侵犯&#xff08…

代码随想录算法【Day7】

DAY7 454.四数相加II 特点&#xff1a; 1.只用返回元组的个数&#xff0c;而不用返回具体的元组 2.可以不用去重 暴力思路&#xff1a;遍历&#xff0c;这样时间复杂度会达到O(n^4) 标准思路&#xff1a;用哈希法&#xff08;场景&#xff1a;在一个集合里面判断一个元素…