System.Collections.Generic.Dictionary = 终极性能?

2023-11-24

我正在编写 Haxe C# 目标,并且一直在研究 Haxe 的 std 库的性能差异,以便我们可以通过其跨平台代码提供尽可能最佳的性能。

哈希表代码就是一个很好的例子。我有点不愿意使用 .NET 的字典,因为它看起来很庞大(由于内存对齐问题,键/值对的结构可能会占用大量内存,除了它保存的不必要的信息之外),并且因为在 std库中没有对象哈希这样的东西,我真的认为我可以通过不必调用 GetHashCode 并一直内联它来压缩一点性能。

而且很明显,Dictionary 实现使用链表来处理冲突,这远非理想。

所以我们开始实现我们自己的解决方案,从IntHash(字典)开始 我们首先实现了跳房子哈希,但结果确实不是很好,但很明显它不能很好地支持巨大的哈希表,因为 H 通常是机器字,并且随着 H / Length 的增加,性能越差。

然后我们开始实施khash- 启发算法。这个有很大的潜力,因为它的基准测试令人印象深刻,并且它可以处理同一阵列上的冲突。它还有一些很棒的功能,比如调整大小而不需要我们两倍的内存。

基准测试令人失望。当然,不用说我们的实现中的内存使用量比 Dictionary 的要低得多。但我也希望能获得不错的性能提升,但不幸的是事实并非如此。并没有低太多——不到一个数量级——但是对于 set 和 gets 来说,.NET 的实现仍然表现得更好。

所以我的问题是:这是我们对 C# 最好的吗?我尝试寻找任何自定义解决方案,但似乎几乎没有。有那个C5通用集合,但是代码太混乱了我什至没有测试。我也没有找到基准。

那么……是这样吗?我应该绕过去吗Dictionary<>?


我发现.NETDictionary在大多数情况下,即使不是特别好,也表现良好。这是一个很好的通用实现。我最常遇到的问题是 2 GB 的限制。在 64 位系统上,您不能向字典中添加超过大约 8950 万个项目(当键是整数或引用,并且值是引用时)。字典开销似乎是每个项目 24 字节。

这个限制以一种非常奇怪的方式为人所知。这Dictionary似乎是通过加倍来增长——当它满了时,它会增加下一个素数的容量,该素数至少是当前大小的两倍。因此,字典将增长到大约 4700 万,然后抛出异常,因为当它尝试加倍(达到 9400 万)时,内存分配失败(由于 2 GB 限制)。我通过预先分配来解决这个问题Dictionary(即调用让您指定容量的构造函数)。这也加快了填充字典的速度,因为它永远不需要增长,这需要分配一个新的数组并重新散列所有内容。

是什么让你这么说Dictionary使用链表来解决冲突?我很确定它使用开放寻址,但我不知道它是如何进行探测的。我想如果它进行线性探测,那么效果类似于使用链表得到的效果。

我们自己写的BigDictionary类突破了 2 GB 的限制,并发现带有线性探测的简单开放寻址方案可提供相当好的性能。它没有那么快Dictionary,但它可以处理数亿个项目(如果我有记忆的话,可以处理数十亿个项目)。

也就是说,你should能够编写更快的特定于任务的哈希表,在某些情况下其性能优于 .NET 字典。但对于通用哈希表,我认为您很难做得比 BCL 提供的更好。

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

System.Collections.Generic.Dictionary = 终极性能? 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 在 WPF 中使用 ReactiveUI 提供长时间运行命令反馈的正确方法

    我有一个 C WPF NET 4 5 应用程序 用户将用它来打开某些文件 然后 应用程序将经历很多动作 读取文件 通过许多插件和解析器传递它 这些文件可能相当大 gt 100MB 因此这可能需要一段时间 我想让用户了解 UI 中发生的情况
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 如何在 Javascript 中对英文和中文混合进行字数统计

    我想统计一篇包含英文和中文的文章中有多少个单词 对于英语来说 这很简单 每个词都是一个词 对于中文 我们将每个字符算作一个单词 因此 香港人在这里是三个词 例如 我是香港人 的字数应该为 6 知道如何在 Javascript jQuery
  • 图片未显示在推送通知中

    我正在使用下面的通知有效负载并使用 Postman 向 Android 设备发送推送通知 to topics xxxx data url https res cloudinary com demo image upload w 200 la
  • 未找到 ClientBuilder 类

    我正在尝试使用 Jersey 框架构建 RESTFul 客户端 因此我添加了以下类 import javax ws rs client Client import javax ws rs client ClientBuilder publi
  • “不是 git 存储库”

    我正在尝试使用一个使用 git 作为后备存储的程序 我是 git 的新手 在初始化时 该程序执行以下操作 git bare rev parse refs heads index 结果是 fatal Not a git repository
  • 快速更新约束

    我将约束添加到我的创建的按钮中UIView func CreateButtonWithIndex index Int newButton setTranslatesAutoresizingMaskIntoConstraints false
  • 将 C++ 对象添加到 Objective-C 类

    我正在尝试混合 C 和 Objective C 我已经完成了大部分工作 但希望在 Objective C 和 C 代码之间有一个接口类 因此我想在 ViewController 接口中有一个持久的 C 对象 由于禁止声明没有类型的 myCp
  • 安装magento,数据库连接错误。

    我正在尝试将 magento 安装到我的 web 主机上 在安装过程中我收到 数据库连接错误 我已正确输入所有值 已联系我的 web 主机以确保我此时陷入困境 他们说参考 magento 论坛额外的支持 我找不到修复方法 任何想法 帮助将不
  • 使用 ggplot2 仅将线段添加到一个方面

    作为一个例子 我有这个数据框 称为my data Groups FactorA FactorB FactorC N value sd se ci 1 Control Condition1 Condition1 Condition1 3 92
  • JPA - 在 persist() 之后返回自动生成的 id

    我正在使用 JPA EclipseLink 和 Spring 假设我有一个带有自动生成 ID 的简单实体 Entity public class ABC implements Serializable Id GeneratedValue s
  • 不使用 Qt 运行 .EXE

    Solution 我想运行我创建的应用程序QtSDK在没有的机器上Qt安装 我尝试复制DLL s来自BIN文件夹到我的项目的发布中 但它不起作用 我尝试了以下方法 我全部复制dll s folder d Qt Qt5 0 1 5 0 1 m
  • 我想在单独的 php 文件上运行 wp_query 以进行 ajax 调用

    例如 ul class thumbs li class li ul
  • 图像标题和换行

    在图像下方添加标题的最佳方法是什么 图像及其标题将向右浮动 并且标题上的文本需要换行 200x200px 的图像不应具有宽度为 800px 的标题 我强烈希望有一个解决方案能够让我在不更改 CSS 或标记的情况下更新图像 具有不同的宽度 由
  • 尝试从 ReadStream 读取时接收错误 Domain=kCFErrorDomainCFNetwork Code=2

    我正在尝试同步读取CFReadStream反对创建者CFStreamCreatePairWithSocketToHost 流打开得很好 但是当我尝试调用时CFReadStreamRead在循环中 CFReadStreamRead 返回 1
  • 使用 Chrome 时的 Selenium“selenium.common.exceptions.NoSuchElementException”

    我正在尝试玩QWOP在 Chrome 上使用 Selenium 但我不断收到以下错误 selenium common exceptions NoSuchElementException Message no such element Una
  • Android 扩展中的实验性功能有利于生产发布

    我正在使用 Parcelize使用 Kotlin 语言进行 Android 开发的功能 为了使用它们 我在 build gradle 文件中进行了以下修改 apply plugin kotlin android extensions the
  • 对字符串数组列表进行排序 C#

    我有一个字符串数组列表 其中数组的格式为 动物 品种 名称 Dog Golden Retriever Rex Cat Tabby Boblawblah Fish Clown Nemo Dog Pug Daisy Cat Siemese We
  • 如何将另一个项目 (Dll) 中的 UserControl 添加到我的 WPF 解决方案中?

    所以 一切都在标题中 我只想在我的 WPF 窗口中添加一个 UserControl 它看起来很简单 但 UserControl 位于同一解决方案的另一个项目 Dll 项目 中 我就是无法参考它 所以 我最好的尝试是这样的
  • 使用 By() 计算变化百分比

    我是一个没有经验的 R 用户 一直在努力使用 By 函数 非常感谢您的帮助 任务很简单 我有一个纵向数据集 如何声明一个 需要通过 ID 计算不同的指标 其中一个指标是简单的百分比变化 需要滞后 示例如下 ID Date Temp Chan
  • 如何在放大弹出插件中的弹出窗口中打开弹出窗口

    谁能告诉我如何使用 magnific popup jquery 插件 使用 ajax 在弹出窗口中打开弹出窗口 ajax popup link magnificPopup type ajax a href path to file html
  • System.Collections.Generic.Dictionary = 终极性能?

    我正在编写 Haxe C 目标 并且一直在研究 Haxe 的 std 库的性能差异 以便我们可以通过其跨平台代码提供尽可能最佳的性能 哈希表代码就是一个很好的例子 我有点不愿意使用 NET 的字典 因为它看起来很庞大 由于内存对齐问题 键