【问题标题】:Why does my program slow down on increasing the size of my hashtable为什么我的程序在增加哈希表的大小时会变慢
【发布时间】:2023-03-12 13:03:01
【问题描述】:

我正在使用 murmur 哈希在哈希表中存储 150,000 个单词 我正在使用线性探测来解决程序中的冲突。我想如果我的hashtable的大小很大,那么会有大量的空闲空间,我就不用去探查很久了。但是奇怪的事情发生了。当哈希表的大小为 250,000 时,我得到了最快的运行时间。之后,运行时间增加。为什么会这样?

【问题讨论】:

  • Locality,可能。
  • 这可能是由于您的 cpu 的缓存大小。一旦缓存填满,内存管理器将不得不调出数据,这会对性能造成很大影响。
  • 除了局部性问题之外,还有许多其他原因可以说明散列表的所谓“1 阶”性能在任何现实世界场景中都是一个神话。
  • @HotLicks 还有什么其他原因?
  • @Aymen - 碰撞处理、溢出处理、散列函数异常、扩展和重新平衡等。

标签: c hashtable


【解决方案1】:

虽然 Robert 涵盖了一般问题(局部性),但问题可能是空间局部性

当您有一个较小的哈希表时,它适合缓存。当您有一个非常大的哈希表时,每次查找都会出现页面错误的高风险。如果出现页面错误,那么您的操作系统需要暂停执行,直到内存管理单元可以将块从访问速度较慢的内存复制到更靠近 CPU 的缓存中。

在极端情况下,访问速度较慢的内存甚至可能是操作系统提供的磁盘资源。

【讨论】:

    【解决方案2】:

    “哈希表通常表现出较差的引用局部性——也就是说,要访问的数据看似随机分布在内存中。因为哈希表会导致访问模式跳来跳去,这会触发微处理器缓存未命中,从而导致长时间延迟. 如果表相对较小且键紧凑,则使用线性搜索搜索数组等紧凑数据结构可能会更快。最佳性能点因系统而异。 - https://en.wikipedia.org/wiki/Hash_table

    【讨论】:

      猜你喜欢
      • 2018-04-07
      • 1970-01-01
      • 2022-01-15
      • 2015-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-17
      相关资源
      最近更新 更多