C# 没有边界检查的 byte[] 比较

2024-03-13

我正在寻找性能高效的方法来比较两个 byte[] 是否相等。大小超过 1 MB,因此每个数组元素的开销应最小化。

我的目标是超越SequenceEqual http://msdn.microsoft.com/en-us/library/bb348567.aspx or a 对每个项目进行手工编码的 for 循环 https://stackoverflow.com/questions/1389570/c-byte-array-comparison-issue, by 避免重复的绑定检查 http://blogs.msdn.com/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx对于两个数组。同样的方式Array.Copy可能会导致快速memcpy,什么会导致memcmp?


您可以使用不安全的代码来执行指针操作。您可以一次将四个字节作为整数进行比较:

public static bool ArrayCompare(byte[] a, byte[] b) {
  if (a.Length != b.Length) return false;
  int len = a.Length;
  unsafe {
    fixed(byte* ap = a, bp = b) {
      int* aip = (int*)ap, bip = (int*)bp;
      for (;len >= 4;len-=4) {
        if (*aip != *bip) return false;
        aip++;
        bip++;
      }
      byte* ap2 = (byte*)aip, bp2 = (byte*)bip;
      for (;len>0;len--) {
        if (*ap2 != *bp2) return false;
        ap2++;
        bp2++;
      }
    }
  }
  return true;
}

A 针对一个简单的循环对此进行了测试,速度大约是原来的六倍。

正如 Josh Einstein 所建议的,long 可以在 64 位系统上使用。实际上,在 32 位和 64 位系统上,它的速度几乎是两倍:

public static bool ArrayCompare64(byte[] a, byte[] b) {
  if (a.Length != b.Length) return false;
  int len = a.Length;
  unsafe {
    fixed (byte* ap = a, bp = b) {
      long* alp = (long*)ap, blp = (long*)bp;
      for (; len >= 8; len -= 8) {
        if (*alp != *blp) return false;
        alp++;
        blp++;
      }
      byte* ap2 = (byte*)alp, bp2 = (byte*)blp;
      for (; len > 0; len--) {
        if (*ap2 != *bp2) return false;
        ap2++;
        bp2++;
      }
    }
  }
  return true;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 没有边界检查的 byte[] 比较 的相关文章

  • 调试Windows服务

    Scenario 我有一个用 C 编写的 Windows 服务 我已经阅读了所有关于如何调试它的谷歌线程 但我仍然无法让它工作 我已经运行 PathTo NetFramework InstallUtil exe C MyService ex
  • 如何在 Google 日历中创建“recurData”?

    我想使用 Google API 创建日历的重复事件 我正在关注链接 谷歌日历API http code google com apis calendar data 2 0 developers guide dotnet html Creat
  • Xamarin 中的 Task.ConfigureAwait(false) - 安全使用/建议使用?

    经验法则是 如果它不是与 UI 相关的方法 请使用Task ConfigureAwait false 如果我有一个接受接口的 PCL 核心库怎么办IUIAccess 核心库中的视图模型有一个方法 public Task ViewModelL
  • 公开 ASP.NET 用户控件中的复杂属性

    我想从自定义 ASP NET 用户控件公开一个复杂的属性 可以通过aspx页面中的控制标签来设置 像这样的事情 public class TestData public int X public int Y public partial c
  • 在 PHP 中将数组转换为字符串并将其恢复为数组

    我正在使用 Serialize 函数将数组存储在我的 MYSQL 数据库中 然后我在其他页面中取消序列化他 数组结构如下所示 Array 0 gt Array names gt somename1 rating gt 10 1 gt Arr
  • 测量渲染时间的工具

    是否有工具可以测量页面上元素的实际渲染时间 我指的不是资源的下载时间 而是浏览器渲染某些内容所花费的实际时间 我知道这个时间会根据客户端计算机上的因素而有所不同 但对于了解渲染引擎需要一段时间加载的内容仍然非常方便 我想这应该是一个有用的实
  • 如何在MVVM架构中将animationview play与LottieForms绑定?

    所以我在列表视图中处理动画 并且我想随时播放一次 所以我想控制它 这是图书馆https github com martijn00 LottieXamarin https github com martijn00 LottieXamarin
  • Windows 消息

    我需要发送带有自定义 ID 的自定义 Windows 消息 其他应用程序将侦听该消息 Windows 是否为内部消息保留任何预定义的消息 ID 范围 如 SQL Server 那样 内部消息最多为 50 000 The 文档 https m
  • FormsAuthentication.SetAuthCookie() 是否需要重定向?

    检查用户的凭据并确认其良好后 我正在使用FormsAuthentication SetAuthCookie Username false 对用户进行身份验证 然后在母版页中我使用Page User Identity IsAuthentica
  • 可变长度数组性能影响 (C/C++)

    我正在编写一个相当简单的函数 它将数组发送到文件描述符 但是 为了发送数据 我需要附加一个一字节标头 这是我正在做的事情的简化版本 它似乎有效 void SendData uint8 t buffer size t length uint8
  • 使用 ASP.NET Core Identity 将令牌保存在 Cookie 中

    我想在我的 身份 生成的 cookie 中保存一些内容 我目前正在使用文档中的默认身份设置 启动 cs services Configure
  • MVC Razor for 循环

    我有这段代码 嵌套在表单帖子内 但我不断收到错误 它缺少结束语 for int i 0 i lt itemsCount i
  • 将对象转换为泛型类型

    我已经有一段时间没有睡觉了 所以这可能比我想象的要容易 我有一个通用类或多或少是这样的 public class Reference
  • Plink 通过 C# 返回不需要的字符

    通过 C 使用 Plink 时 我在结果前后收到不需要的字符 Command ls l informatica tgtdynamicparams out grep vaulttest grep Sep 1 awk print 9 sort
  • 如何在网格视图中突出显示文本的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 如何突出显示某个单词 https stackoverflow com questions 9546761 how can i highlight a word 我有一个网格视图和一个文本框 用于从列中
  • MDI 窗体中的子窗口对接

    我有一个 MDI 表单和其中的一些子表单 我将子窗体停靠到 MDI 窗口的不同区域 但是当任何子窗体失去焦点时 其他停靠的窗体将重新排列 由于混乱 我准备了一组图像来展示该行为 Image1 单击任何窗口之前 Image2 点击窗口2后 问
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • 按广度优先顺序列出目录所有内容导致效率低下

    我编写了一个 Haskell 模块来按广度优先顺序列出目录的所有内容 下面是源代码 module DirElements dirElem where import System Directory getDirectoryContents
  • 生成唯一随机数的智能方法

    我想生成 00000001 到 99999999 范围内的唯一随机数序列 所以第一个可能是 00001010 第二个可能是 40002928 等等 最简单的方法是生成一个随机数并将其存储在数据库中 下次再执行一次并检查数据库中该数字是否已存
  • 使用概率选择数组值

    我还有一个作业要做 那就是 从黄色 蓝色和红色中随机选择一种颜色 概率为 黄色 3 7 蓝色 1 7 红色 3 7 我知道我可以通过使用类似的方法来解决这个问题 黄黄黄蓝红红红 但我认为这在编程上不是很好 因为当我碰巧发生这种情况时 我将不

随机推荐

  • 适用于 Windows 的 Python 服务存在一些问题

    我已经检查了至少几十个与我类似的案例 但仍然没有找到解决方案 我希望有人能提供一些线索 这里一定有我遗漏的东西 我正在使用Python3 6制作Windows服务 如果该服务未运行 则必须运行 exe文件 这是 py import win3
  • JAVA_HOME 和 PATH 已设置,但 java -version 仍显示旧版本

    我正在使用 Linux Mint Cinnamon 14 我已经设置了 JAVA HOME and PATH环境变量在 profile如下 export JAVA HOME home aqeel development jdk jdk1 6
  • 使用 Podman 连接到 VPN

    有了这个Dockerfile FROM fedora 30 ENV LANG C UTF 8 RUN dnf upgrade y dnf install y openssh clients openvpn slirp4netns dnf c
  • java 计算字符串中的空格数

    我写了一个程序 需要String作为用户输入并显示字母 数字和的数量white spaces 我使用以下代码编写了代码Tokenizer class 它计算字母和数字 但忽略了white spaces 有任何想法吗 import java
  • 如何找到贝塞尔曲线的中点?

    我想制作一条 命名 贝塞尔曲线 我希望它是一个单词命名的 这样我就不必担心自动换行 我通过P5制作贝塞尔曲线bezier sx sy c1x c1y c2x c2y ex ey 函数 我希望在贝塞尔曲线的中间显示一个字符串 但我不知道如何找
  • 获取双动画的当前值

    我有一个故事板 我正在其中使一个矩形向上移动 就像 MPH 汽车仪表中的针一样 所以 我让它从 0 到 60 我希望能够在它变化时获得它的当前值 这样我就可以使用该值来制作数字仪表 如何获取双动画从开始到结束的当前值 我有这样的事情 Dou
  • 如何获得两个集合的交集,同时不仅通过引用而且还通过它们的相同结构和条目识别相等的集合值/项目?

    我有两个交易两个Set实例 const set1 new Set name a name b lastname bb name c name d const set2 new Set name b name d 集合中的任何对象都将具有多个
  • 如何在 heroku 上启动 Python SimpleHTTPServer?

    我想在heroku 上启动Python HTTPServer 请注意 这不是 Python 框架 代码片段附在下面 我如何才能在 Heroku 上启动此服务器 我可以在本地计算机上运行该服务器 但我希望它部署在 Heroku 上 请提供见解
  • Web 应用程序作为服务自动更新,无需启动器

    如果应用程序是没有启动器的 Web 应用程序即服务 install4j 中的自动更新功能是否有效 我尝试了网络资源中提到的许多方法 但没有成功 请帮忙 我正在使用 install4j Windows 版本 6 1 6 编辑1 英戈 凯格尔
  • Bootstrap 4 - Scrollspy 不起作用

    我已经按照BS4中如何使用Scrollspy的文档进行操作 但它不起作用 那么我该如何解决它 我的身体有posistion relative 这是我的身体标签 这是导航栏的 HTML
  • 对 data.frame 或矩阵中的行求和

    我有一个非常大的数据框 其中行作为观察值 列作为遗传标记 我想创建一个新列 其中包含使用 R 的每个观察的选定列数的总和 如果我有 200 列和 100 行 那么我希望创建一个有 100 行的新列 其中包含第 43 至 167 列的总和 这
  • 异步套接字 - 处理错误的 socket.AcceptAsync 值

    Socket 类有一个方法 AcceptAsync 它返回 true 或 false 我原以为 false 返回值是一个错误条件 但在 Microsoft 为异步套接字提供的示例中 它们在检查失败后同步调用回调函数 如下所示 public
  • 如何制作一个钝角的按钮?

    如何制作一个钝角的按钮 我希望发生这样的事 我就这样来到这里 我的代码 Fiddle https jsfiddle net soledar10 nLt9qd5s box sizing border box btn display inlin
  • Android mkdirs() 不工作

    我正在开发我的第一个 Android 应用程序 在尝试创建目录来保存录制的视频文件时遇到了问题 我的主要活动有一个方法buttonOnClickRecord调用使用 android 相机的意图 我还在这个方法调用期间创建了一个文件 并且我正
  • 如何找出方法或函数的调用者是谁? [复制]

    这个问题在这里已经有答案了 我想编写一个调试函数或方法来帮助打印有用的信息 当它被调用时 我需要 调用对象的内存地址 如果由对象调用 调用者的方法签名 或方法的名称 或函数的名称 拥有该方法或函数的类名 是否可以在不传递一大堆参数的情况下获
  • 为什么我无法使用 Puppeteer 访问 hideFunction() 函数中的“窗口”?

    我有一个非常简单的傀儡师 https github com GoogleChrome puppeteer使用的脚本exposeFunction https github com GoogleChrome puppeteer blob mas
  • Swift 中数组的 endIndex 的正确行为是什么?

    endIndex 返回与 count 相同的值 这是正确的行为还是错误 var ar 1 2 3 4 ar count 4 ar endIndex 4 count是集合中的项目数 而endIndex is the Index 来自Colle
  • Android - 移动网络设置菜单(Jelly Bean)

    以下代码不适用于 Jelly Bean Android 4 1 final ComponentName cn new ComponentName com android phone com android phone Settings fi
  • ios 中纹理的多重采样渲染

    我正在尝试在启用多重采样的 ios 中渲染到纹理 然后在最终输出中使用该纹理 这可能吗 到目前为止 我只得到了黑色纹理或锯齿图像 我正在使用的代码是 glGenTextures 1 texture glBindTexture GL TEXT
  • C# 没有边界检查的 byte[] 比较

    我正在寻找性能高效的方法来比较两个 byte 是否相等 大小超过 1 MB 因此每个数组元素的开销应最小化 我的目标是超越SequenceEqual http msdn microsoft com en us library bb34856