当前位置: 首页 > news >正文

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

主要用到两个指令集,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.mrgr.cn/news/37057.html

相关文章:

  • Python画笔案例-065 海龟绘图艺术画
  • Selenium入门
  • 一篇文章讲清楚synchronized关键字的作用及原理
  • 初识C语言(三)
  • Redis一些简单通用命令认识常用数据类型和编码方式认识Redis单线程模型
  • 【RabbitMQ 项目】客户端:连接模块
  • C语言指针系列2——加深理解
  • 使用 sponge + dtm 轻松实现秒杀抢购服务(HTTP),彻底解决库存与订单数据不一致的难题
  • OpenCV
  • Promise笔记
  • 【数据结构】AVL树相关知识详细梳理
  • ubuntu更换镜像源及巧妙使用Python脚本解决文件编码问题
  • 【学习笔记】网络设备(华为交换机)基础知识7——查看硬件信息 ① display device 命令详解
  • 一个证明-待验证
  • Redis配置文件详解(上)
  • Java文件上传同时传入JSON参数
  • 11. Map和Set
  • RabbitMQ下载安装运行环境搭建
  • 大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据
  • 第18周 3-过滤器