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

news2025/1/4 23:22:37

        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 sandbox
    for (UINT32 i = 0; i < threadParam->sandBoxSize; i++)
    {
        buffer[i] = (UINT8)(i);// * (UINT32)threadParam->loops);
    }

    while ((GetTickCount() - tStart) < threadParam->durationMs)
    {
        // Read back from sandbox
        for (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 kB

    HANDLE 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.coloradmin.cn/o/2269573.html

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

相关文章

汽车损坏识别检测数据集,使用yolo,pasical voc xml,coco json格式标注,6696张图片,可识别11种损坏类型,识别率89.7%

汽车损坏识别检测数据集&#xff0c;使用yolo&#xff0c;pasical voc xml&#xff0c;coco json格式标注&#xff0c;6696张图片&#xff0c;可识别11种损坏类型损坏&#xff1a; 前挡风玻璃&#xff08;damage-front-windscreen &#xff09; 损坏的门 &#xff08;damaged-d…

西门子1200PLC和三菱FX3系列PLC接线方法

1、西门子1200PLC接线方法。* 2、从三菱官方手册查询得知&#xff0c;S/S公共端有两种接法&#xff0c;但是为了与西门子1200接法保持一致&#xff0c;所以也建议采用S/S公共点0V的接法。 **【总结】 三菱输入端采用公共点接0V接法建议提升至公司内部标准规范&#xff1a; …

一文理清JS中获取盒子宽高各方法的差异

前言 这段时间在研究一个反爬产品&#xff0c;环境检测用到了很多个盒子宽高取值方法&#xff0c;如window.outerWidth、window.screen.availWidth&#xff0c;各个方法取值结果不大相同&#xff0c;在此记录下遇到的方法。 各宽方法区别 这里就讲解下各宽度方法的区别&…

AWVS安装使用教程

一、AWVS工具介绍及下载 AWVS工具介绍 AWVS&#xff08;Acunetix Web Vulnerability Scanner&#xff09;是一款知名的网络漏洞扫描工具&#xff0c;它通过网络爬虫测试你的web站点&#xff0c;检测流行安全漏洞&#xff0c;可以检查SQL注入漏洞&#xff0c;也可以检查跨站脚…

用Python操作字节流中的Excel文档

Python能够轻松地从字节流中加载文件&#xff0c;在不依赖于外部存储的情况下直接对其进行读取、修改等复杂操作&#xff0c;并最终将更改后的文档保存回字节串中。这种能力不仅极大地提高了数据处理的灵活性&#xff0c;还确保了数据的安全性和完整性&#xff0c;尤其是在网络…

【LeetCode】928、尽量减少恶意软件的传播 II

【LeetCode】928、尽量减少恶意软件的传播 II 文章目录 一、并查集1.1 并查集 二、多语言解法 一、并查集 1.1 并查集 先把普通点, build 并查集遍历每个源头点, 找源头点附近的点所在的集合, 传染该集合拯救节点 3.1 若该节点 所在集合, 从未被感染过, 则开始感染 3.2 若该节…

(NDSS2024)论文阅读——仅低质量的训练数据?用于检测加密恶意网络流量的稳健框架

文章基本信息 作者&#xff1a;Yuqi Qing et al. &#xff08;清华大学李琦团队&#xff09; 代码 文章 摘要 存在问题&#xff1a;收集包含足够数量的带有正确标签的加密恶意数据的训练数据集是具有挑战性的&#xff0c;当使用低质量的训练数据训练机器学习模型时&#xff…

如何将CSDN文章 导出为 PDF文件

一、首先&#xff0c;打开我们想要导出为 PDF格式的 CSDN文章&#xff0c;以下图为例。 二、按 F12 调出浏览器调式模式后&#xff0c;选择 控制台 三、在控制台处粘贴代码 代码&#xff1a; (function(){ use strict;var articleBox $("div.article_content"…

YApi接口管理平台本地搭建方法介绍

YApi是一个免费开源的API管理平台&#xff0c;开发人员可用它来管理、调试接口&#xff0c;并且提供了API文档管理和测试功能&#xff0c;具有友好的UI页面&#xff0c;本文介绍Linux环境如何安装部署YApi接口管理平台。 目录 1 环境准备2 安装部署2.1 安装nodejs2.2 安装 Mong…

案例分析-采样率对模拟链路的带宽的影响

目录 问题来源: 情况分析: 总结 问题来源: 在进行模拟带宽调整时,发现设计值 与实测值,不一样,就这一问题,进行详细分析。 情况分析: 在本项目中,采用巴特沃兹四阶滤波器,设计带宽350M,改滤波器设计可以采用fiter solution工具进行设计,实测值仅仅260M,因此针…

Huggingface Trending!可控人物图像生成统一框架Leffa,可精确控制虚拟试穿和姿势转换!

今天给大家介绍一个Huggingface上虚拟试穿的热门项目Leffa&#xff0c;Leffa是一个可控人物图像生成的统一框架&#xff0c;可以精确操纵外观&#xff08;即虚拟试穿&#xff09;和姿势&#xff08;即姿势转换&#xff09;。从效果看生成效果很不错&#xff01; 相关链接 论文&…

memcached的基本使用

memcached是一种基于键值对的内存数据库&#xff0c;一般应用于缓存数据&#xff0c;提高数据访问速度&#xff0c;减轻后端数据库压力。 安装 这里以Ubuntu为例&#xff0c;其他系统安装方法请看官方文档。 sudo apt-get update sudo apt-get install memcached启动 memca…

ROS话题通信

1 .理论模型 话题通信实现模型是比较复杂的&#xff0c;该模型如下图所示,该模型中涉及到三个角色: ROS Master (管理者)Talker (发布者)Listener (订阅者) ROS Master 负责保管 Talker 和 Listener 注册的信息&#xff0c;并匹配话题相同的 Talker 与 Listener&#xff0c;…

经验证:将数据从索尼传输到Android的 4 种方法

概括 像Android Galaxy S20 这样的新型Android智能手机很酷&#xff0c;但除了将数据从索尼传输到Android之外。众所周知&#xff0c;旧的索尼手机上存储着大量的文件&#xff0c;因此将数据从旧的索尼手机传输到新的Android手机非常重要。为了解决这个问题&#xff0c;我们做…

VITUREMEIG | AR眼镜 算力增程

根据IDC发布的《2024年第三季度美国AR/VR市场报告》显示&#xff0c;美国市场AR/VR总出货量增长10.3%。其中&#xff0c;成立于2021年的VITURE增长速度令人惊艳&#xff0c;同比暴涨452.6%&#xff0c;成为历史上增长最快的AR/VR品牌。并在美国AR领域占据了超过50%的市场份额&a…

JavaSpring AI与阿里云通义大模型的集成使用Java Data Science Library(JDSL)进行数据处理

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…

git reset --hard(重置到当前提交,所有未提交的更改都会被永久丢弃)

git reset --hard 是一个强大的命令&#xff0c;它会将你的工作目录、暂存区和当前分支的 HEAD 指针重置到指定的提交状态&#xff0c;所有未提交的更改都会被永久丢弃。因此&#xff0c;使用这个命令时需要非常小心。 基本用法 重置到当前提交&#xff08;丢弃所有未提交的更…

基于单片机智能水产养殖系统设计(论文+源码)

1 系统方案设计 根据系统设计需求&#xff0c;对智能水产养殖系统总体方案展开详细设计。如图2.1所示为系统设计总框架&#xff0c;系统以STM32单片机作为主控制器&#xff0c;通过DS18B20温度传感器、水位传感器、TSW-30浊度传感器、光照传感器实现水产养殖环境中水温、水位、…

基于微信小程序的校园点餐平台的设计与实现(源码+SQL+LW+部署讲解)

文章目录 摘 要1. 第1章 选题背景及研究意义1.1 选题背景1.2 研究意义1.3 论文结构安排 2. 第2章 相关开发技术2.1 前端技术2.2 后端技术2.3 数据库技术 3. 第3章 可行性及需求分析3.1 可行性分析3.2 系统需求分析 4. 第4章 系统概要设计4.1 系统功能模块设计4.2 数据库设计 5.…

Mysql学习笔记之约束

1.简介 MySQL中的约束用于定义表中数据的规则&#xff0c;以确保数据的准确性和完整性。以保证数据表中数据的有效性、正确性和完整性。 2.约束分类 在mysql中约束分类如下&#xff1a; 约束说明关键字主键约束每个表只能有一个主键&#xff1b;主键的值必须唯一&#xff0…