C# 利用simd比较两个文件是否相等(高性能)

news2024/11/19 0:21:31

主要用到两个指令集,CompareEqual指令与MoveMask指令,因为电脑cpu原因,我们采用Avx2。

Avx2.CompareEqual,比较两个Vector256<byte>向量,如果元素相同返回255,否则返回0。

Avx2.MoveMask如果Vector256<byte>向量全为为非0且所有元素相等,返回-1,全为0返回0,其它返回其它整数。

代码如下:

但是如果文件太大,一次性加载的数据太多了也慢,而且占用内存,我们可以分批次加载,如下:

static unsafe bool CompareFileContent2(string file1, string file2)
        {
            const int size = 10;
            int vsize = Vector256<byte>.Count;
            int count = vsize << size;
            using FileStream fs1 = File.Open(file1, FileMode.Open);
            using FileStream fs2 = File.Open(file2, FileMode.Open);
            byte* one = stackalloc byte[count];
            byte* two = stackalloc byte[count];
            Vector256<byte> vectorOne;
            Vector256<byte> vectorTwo;
            var oneSpan = new Span<byte>(one, count);
            var twoSpan = new Span<byte>(two, count);
            bool result = true;
            int len1, len2;
            while (true)
            {
                len1 = fs1.Read(oneSpan);
                len2 = fs2.Read(twoSpan);
                if (len1 != len2)
                {
                    result = false;
                    break;
                }
                if(len1 == 0 && len2==0)
                    break;
                if(len1 == 0 ||  len2 == 0)
                {
                    result = false;
                    break;
                }

                for (int i = 0; i < count; i+= vsize)
                {
                    vectorOne = *(Vector256<byte>*)(one+i);
                    vectorTwo = *(Vector256<byte>*)(two+i);
                    var equalMask = Avx2.CompareEqual(vectorOne, vectorTwo);
                    if (Avx2.MoveMask(equalMask) != -1)
                    {
                        result = false;
                        return result;
                    }
                }
            }
            return result;
        }

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

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

相关文章

滚珠丝杠在人形机器人及线控制动和转向中大放异彩

直线驱动器用于对旋转角度不大、高负载的场景,在人形机器人中多用于四肢。直线驱动器多采取“电机+丝杠”,将旋转运动转为关节末端的直线运动,能够起到较好的支撑和承重效果,能够较好的适配应用场景的负载需求。 特斯拉人形机器人Optimus 双足、双臂采用连杆结构,连杆末端…

GS-SLAM论文阅读笔记--GEVO

前言 这篇文章看着就让人好奇。众所周知&#xff0c;高斯是一个很不错的建图方法&#xff0c;但是本文的题目居然是只用高斯进行单目VO&#xff0c;咱也不知道这是怎么个流程&#xff0c;看了一下作者来自于MIT&#xff0c;说不定是个不错的工作&#xff0c;那就具体看看吧&am…

IDEA服务启动时无法输出日志

起服务时&#xff0c;控制台啥日志也没有 解决方案&#xff1a;选择【启用调试输出】 SQL的日志无法打印 原来安装了一个Mybatis Log Free&#xff0c;用的好好的。 后来换了个项目&#xff0c;SQL执行日志就打印不出来了。 解决方案&#xff1a;换个插件&#xff0c;我换了…

Python语言把二进制转成十六进制

0 Preface/Foreword 0.1 10进制转其他进制 bin()oct()hex() 0.2 其他进制转10进制 int(, 2)int(, 8)int(, 16) 1 转换方法 1.1 方法1 先将二进制转成10进制&#xff0c;再将10进制转成16进制 decim int(00000101, 2) hexadecim hex(decim) print hexadecim 1.2 方法…

Snap AR眼镜Spectacles的技术揭秘:通往真正AR体验的道路

Snap公司自2010年成立以来&#xff0c;一直致力于探索增强现实&#xff08;AR&#xff09;技术的边界。经过多年的研发与迭代&#xff0c;Snap终于在最新一代Spectacles中实现了重大突破&#xff0c;为用户带来了前所未有的沉浸式AR体验。本文将深入探讨Spectacles的发展历程、…

【vue3】登录功能怎么实现?

无论是手机端还是pc端&#xff0c;几乎都包含登录注册方面功能&#xff0c;今天总结登录注册功能。 实现功能 注册 密码加密 登录 校验 token处理 1.环境搭建运行&#xff08;nodeexpressmongodb&#xff09; 在目录里安装express和mongoose&#xff0c;并在根目录创建server.j…

C语言编译和链接详解(通俗易懂,深入本质)

我们平时所说的程序,是指双击后就可以直接运行的程序,这样的程序被称为可执行程序(Executable Program)。在 Windows 下,可执行程序的后缀有.exe和.com(其中.exe比较常见);在类 UNIX 系统(Linux、Mac OS 等)下,可执行程序没有特定的后缀,系统根据文件的头部信息来判…

YOLOv8改进 - 注意力篇 - 引入SK网络注意力机制

一、本文介绍 作为入门性篇章&#xff0c;这里介绍了SK网络注意力在YOLOv8中的使用。包含SK原理分析&#xff0c;SK的代码、SK的使用方法、以及添加以后的yaml文件及运行记录。 二、SK原理分析 SK官方论文地址&#xff1a;SK注意力文章 SK注意力机制:SK网络中的神经元可以捕…

音视频通话 SDK

腾讯云视立方音视频通话 SDK 是音视频终端 SDK&#xff08;腾讯云视立方&#xff09;的子产品 SDK 之一&#xff0c;基于音视频通话场景&#xff0c;提供专属含 UI 快速接入方案&#xff0c;仅需三步即可快速集成上线&#xff0c;轻松实现1对1视频聊天、多人视频通话和聊天应用…

内网基础知识

内网基础知识 寄了&#xff0c;最后net time /domain命令还是运行不了 内网也指局域网(Local Area Network&#xff0c;LAN)&#xff0c;是指在某一区域内由多台计算机互连而成的计算机组&#xff0c;组网范围通常在数千米以内。 工作组 work group 一种资源管理模式&#…

[SAP ABAP] PARAMETERS

PARAMETERS定义用户可以输入值的输入字段(单值Input) 基本语法 PARAMETERS PNAME. PNAME命名长度不能超过8位 PARAMETERS创建一个单一的输入域且最多只能输入一行&#xff0c;定义后的PNAME可作为变量在程序中运用 示例1 p_1的数据类型为CHAR1 输出结果&#xff1a; 补…

6.使用 VSCode 过程中的英语积累 - Run 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

.NET 6.0 使用log4net配置日志记录方法

1.包管理器引入相关包 2.添加Log4net文件夹和log4net.config配置文件(配置文件属性设为始终复制)。 3.替换 log4net.config的内容(3.1与3.2选择一个就好,只是创建日志文件有所区别) 3.1: <?xml version"1.0" encoding"utf-8"?> <configuration…

JavaWeb美食推荐管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 login.jsp 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优…

OceanBase技术解析:自适应分布式下压技术

在《OceanBase 数据库源码解析》这本书中&#xff0c;关于SQL执行器的深入剖析相对较少&#xff0c;因此&#xff0c;希望增添一些实用且详尽的补充内容。 上一篇博客《 OceanBase技术解析&#xff1a; 执行器中的自适应技术》中&#xff0c;已初步介绍了执行器中几项典型的自适…

HarmonyOS异常处理实践

一、HarmonyOS应用异常处理框架 全面检测、精准记录异常传播路径、日志精简 二、FaultLog FaultLog是应用异常日志查询接口&#xff0c;提供QuerySelfFaultLog接口以查询自身故障。 JS_CRASH&#xff1a;ArkTS程序故障类型 CPP_CRASH&#xff1a;C程序故障类型 APP_FREEZE&…

csv导入导出

一、csv 1、介绍 CSV&#xff08;Comma-Separated Values&#xff0c;逗号分隔的值&#xff09;是一种简单、实用的文件格式&#xff0c;用于存储和表示包括文本、数值等各种类型的数据。CSV 文件通常以 .csv 作为文件扩展名。这种文件格式的一个显著特点是&#xff1a;文件内…

JavaSE——Arrays类、System类

目录 一、Arrays类 1.Arrays.toString() 2.Arrays.sort() 3.Arrays实现冒泡排序的定制排序 4.Arrays.binarySearch()——二叉查找 5.Arrays.copyOf()——数组元素的复制 6.Arrays.fill()——数组的填充 7.Arrays.equals(arr1,arr2)——比较2个数组元素内容是否完全一致…

java中的ArrayList和LinkedList的底层剖析

引入: 数据结构的分类&#xff0c;数据结构可以分成&#xff1a;线性表&#xff0c;树形结构&#xff0c;图形结构。 线性结构(线性表)包括:数组、链表、栈队列 树形结构:二叉树、AVL树、红黑树、B树、堆、Trie、哈夫曼树、并查集 图形结构:邻接矩阵、邻接表 线性表是具有存…

通信工程学习:什么是TDD时分双工

TDD:时分双工 TDD(时分双工,Time Division Duplexing)是一种在移动通信系统中广泛使用的全双工通信技术。以下是TDD的详细解释: 一、定义与原理 TDD是一种通过时间划分来实现双向通信的技术。在TDD模式中,接收和传送在同一频率信道(即载波)的不同时隙…