C 比较两个位图的最快方法

2023-12-23

有两个字符数组形式的位图数组,有数百万条记录。使用 C 来比较它们的最快方法是什么?

我可以想象在 for 循环中一次使用按位运算符异或 1 个字节。

关于位图的重要一点:

  • 算法运行的 1% 到 10% 次中,位图可能会有所不同。大多数时候它们都是一样的。当它们可以不同时,它们可以达到 100%。连续条纹中比特发生变化的可能性很高。
  • 两个位图的长度相同。

Aim:

  • 检查它们是否不同,如果是,那么在哪里。
  • 每次都正确(如果有错误,检测到错误的概率应该为 1)。

此答案假设您将“位图”视为 0/1 值的序列,而不是“位图图像格式”

如果您只有两个长度相同的位图并希望快速比较它们,memcmp()正如评论中有人建议的那样,将会有效。如果您想尝试使用 SSE 类型优化,您可以这样做,但这些并不像memcmp(). memcmp()假设您只是想知道“它们是不同的”,仅此而已。

如果您想知道它们有多少位不同,例如615 位不同,那么除了对每个字节进行异或并计算差异数量之外,您别无选择。正如其他人所指出的,您可能希望一次以 32/64 甚至 256 位执行此操作,具体取决于您的平台。然而,如果数组有数百万字节长,那么最大的延迟(对于当前的 CPU)将是将主内存传输到 CPU 的时间,并且 CPU 做什么并不重要(这里有很多警告)

如果你的问题更多的是关于比较 A 和 B,但实际上你已经这样做了很多次,例如 A 到 B 和 C、D、E 等,那么你可以做几件事

  • A. 存储每个数组的校验和,并首先比较校验和,如果它们相同,则数组很可能相同。显然,这里存在校验和可能相等但数据可能不同的风险,因此请确保这种情况下的错误结果不会产生严重的副作用。而且,如果您无法承受错误结果,请不要使用此技术。
  • B.如果数组具有结构,例如它们是图像数据,那么为此利用特定的工具,这个答案无法解释。
  • C. 如果图像数据可以有效压缩,则压缩每个数组并使用压缩后的形式进行比较。如果您使用 ZIP 类型的压缩,您无法直接从 zip 中得知有多少位不同,但其他技术(例如 RLE)可以有效地快速计算位差异(但构建并获得正确和快速的工作量很大)
  • D. 如果 (a) 的风险是可以接受的,那么您可以对每个块(例如 262144 位)进行校验和,并且仅计算校验和不同的差异。这大大减少了对主内存的访问,并且速度会更快。

所有选项 A..D 都是关于减少主内存访问,因为这是任何性能增益的关键(对于所述问题)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 比较两个位图的最快方法 的相关文章

  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 为什么 Cdecl 调用在“标准”P/Invoke 约定中经常不匹配?

    我正在开发一个相当大的代码库 其中 C 功能是从 C P Invoked 的 我们的代码库中有很多调用 例如 C extern C int stdcall InvokedFunction int 使用相应的 C DllImport CPlu
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 使用 using 声明时,非限定名称查找如何工作?

    根据 C 标准 这是格式错误还是格式良好 namespace M struct i namespace N static int i 1 using M i using N i int main sizeof i Clang 拒绝它 GCC
  • 颜色渐变算法

    给定两种 RGB 颜色和一个矩形 我可以创建一个基本的线性渐变 这博客文章 https bsou io posts color gradients with python关于如何创建它给出了很好的解释 但我想在这个算法中添加一个变量 角度
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • 多语言安卓应用程序?

    我必须用 3 种语言制作我的 Android 应用程序 即德语 英语和荷兰语 我在我的 Android 应用程序名称中创建了三个文件夹values de and values nl在 res 目录中 现在 当用户选择特定语言时 我执行以下代
  • 如何使用 gitlab-ci 中的托管标识进行身份验证,将 docker 容器从 gitlab 注册表推送到 Azure Web 服务?

    我研究了将 docker 镜像从 gitlab 容器注册表推送到 azure 资源的方法 将 Docker 映像从 gitlab ci 推送到 Azure 容器注册表 https stackoverflow com questions 49
  • 如何将 git 提交消息保存到文件中?

    想要提交 修复错误并将更改发送到 GIT 存储库 但消息数超出了 Unix 命令行中显示的行数 因此我无法读取错误消息 如何将 GIT 提交消息保存到文件或可能增加 Unix 命令行上显示的行数 似乎在这个 GIT 构建中使用了钩子 它显示
  • 如何从Android中的CalendarView中选择日期范围?

    我需要从 android 的 CalenderView 中选择多次日期 任何人都可以帮助我做同样的事情吗 例子 让我们看看附图 如果我们将图像中的日历视为 android 的日历视图 我需要选择从 16 日到 20 日的所有日期 据我所知C
  • Yii2,抛出NotFoundException时发生错误

    我有一个在应用程序的 beforeAction 事件上运行的简单代码 on beforeAction gt function event throw new yii web NotFoundHttpException The request
  • 如何通过索引将项目添加到 Laravel Eloquent Collection 中?

    我尝试了以下方法 但它不起作用 index 2 collection gt put index item4 例如 如果 collection 看起来像这样 collection item1 item2 item3 我想结束 collecti
  • Gradle 在 bin 目录中创建重复的启动脚本

    我正在尝试通过 gradle 创建多个启动脚本文件 但不知何故 一个特定的启动脚本文件正在重复 startScripts enabled false run enabled false def createScript project ma
  • Java 泛型放在 Map>

    有没有办法以类型安全的方式进行以下实现 public void myMethod Map
  • 如何比较 Svelte 3 中的 Prop 变化

    Svelte 3 中是否有一种机制可以在渲染之前比较组件内的 prop 更改 类似于 反应从Props获取DerivedState https reactjs org docs react component html static get
  • 车把模板中 href 标签中的 Ember 插值

    我正在尝试建立一个到谷歌地图的简单链接 并将动态地址插入到 href 字段中 我已经尝试过下面的代码以及大量其他乱七八糟的东西 但没有运气 如何在车把 href 字段中插入动态 ember 字符串 我正在使用 ember 导轨和车把 如果我
  • 将二进制路径添加到 emacs $PATH

    我尝试了以下方法 setenv PATH concat getenv PATH mybin setq exec path append exec path mybin 但这从来没有奏效 我试过M 并键入二进制名称之一 并且在使用二进制名称进
  • Select2:init后如何设置数据?

    我需要在初始化 select2 后设置一个数据数组 所以我想做这样的事情 var select select select2 select data id 1 text value1 id 1 text value1 但我收到以下错误 当附
  • 连接字符串和实体框架的问题

    我有一个数据库 sql 2008 mdf 文件 一个带有 edmx 文件的类库项目 是使用向导创建的 所以连接字符串也是由向导制作的 该项目位于 teamfoundation 服务器上 我可以在编码时使用所有向导创建的对象 但是当我运行程序
  • DisplayFormat 未应用于十进制值

    我有一个模型属性 我正在尝试使用 EditorFor 模板进行渲染 并且我正在尝试使用 DisplayFormat 属性应用格式 然而 它根本不起作用 它完全被忽略了 这是我的模板 model System Decimal Html Tex
  • IoC:如何动态创建对象

    我无法理解如何在需要动态创建对象的场景中使用 IoC 假设我有这样的课程 abstract class Field public Field ICommandStack commandStack abstract class Entity
  • 使用 python 的树莓派旋转编码器脚本

    我有一个设置 其中有一个电机以每秒约 1 转的速度转动直径 5 厘米的轴 我需要在预定的转数后停止电机 现在假设是 10 转 我使用的传感器机制只是一个磁铁和簧片开关 以下脚本可以很好地记录每次触发开关的情况 import RPi GPIO
  • Android SQLite 数据库损坏

    这个链接准确地描述了我的问题 http old nabble com Android database corruption td28044218 html a28044218 http old nabble com Android dat
  • 如何在postgresql中使用设置种子选择可重复的随机数?

    我想要实现的是为流程选择一个控制组 为此 我使用 random 为了调试 一致性 我希望能够以可重复的方式设置随机数 意思是 一旦它为用户 123 分配随机数 0 001 我就运行查询 在不同的时间 我删除以前的数据 调用相同的查询 并再次
  • 如何从应用程序设置 Azure (webapp) 接收数据到我的 webjob

    我用 C 创建了一个 Azure WebJob 我在 Azure 上有一个 Web 应用程序 我将 WebJob 添加到了我的订阅中 一切都很好 但在应用程序设置中我添加了一个新条目 例如
  • C 比较两个位图的最快方法

    有两个字符数组形式的位图数组 有数百万条记录 使用 C 来比较它们的最快方法是什么 我可以想象在 for 循环中一次使用按位运算符异或 1 个字节 关于位图的重要一点 算法运行的 1 到 10 次中 位图可能会有所不同 大多数时候它们都是一