热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

使用链接与开放寻址的哈希表中的缓存性能

如何解决《使用链接与开放寻址的哈希表中的缓存性能》经验,为你挑选了1个好方法。

在以下来自geeksforgeeks.org的网站中,它说明了这一点

链接的缓存性能不好,因为密钥是使用链表存储的.由于所有内容都存储在同一个表中,因此开放式寻址可提

所以我的问题是:

是什么导致链接具有错误的缓存性能?

缓存在哪里使用?

为什么开放寻址会提供更好的缓存性能,因为我看不到缓存是如何进入的?

在决定链接和线性探测开放寻址和二次探测开放寻址之间时,您还要考虑什么?

Andriy Beres.. 10

对不起,由于问题非常广泛,答案也会非常通用,有些链接可以提供更详细的信息.

最好从问题开始:

缓存在哪里使用?

在现代CPU上,缓存随处可见:读取程序指令和读取/写入内存中的数据.在大多数CPU上,缓存是透明的,即不需要显式管理缓存.

缓存是比主存储器(DRAM)更快.为了给您一个透视图,访问1级缓存中的数据大约是4个CPU周期,而访问同一CPU上的DRAM大约是200个CPU周期,即快50倍.

缓存在称为缓存行的小块上运行,缓存行通常为64字节长.

更多信息:https://en.wikipedia.org/wiki/CPU_cache

是什么导致链接具有错误的缓存性能?

基本上,链接不是缓存友好的.这不仅仅是哈希表中的这种情况,与"经典"列表相同.

散列键(或列表节点)彼此远离,因此每个键访问都会产生"高速缓存未命中",即缓慢的DRAM访问.因此,检查链中的10个密钥需要10个DRAM访问,即200 x 10 = 2000我们的通用CPU的循环.

next在当前密钥中读取指针之前,不知道下一个密钥的地址,因此优化空间不大......

为什么开放寻址会提供更好的缓存性能,因为我看不到缓存是如何进入的?

线性探测是缓存友好的.密钥"聚集"在一起,因此一旦我们访问第一个密钥(慢速DRAM访问),很可能下一个密钥将已经在缓存中,因为缓存行是64字节.因此,使用开放寻址访问相同的10个密钥需要1个DRAM访问和9个缓存访问,即200 x 1 + 9 x 4 = 236我们的通用CPU的循环.对于链式密钥,它比2000个周期快得多.

此外,由于我们以可预测的方式访问内存,因此可以进行缓存预取等优化:https://en.wikipedia.org/wiki/Cache_prefetching

在决定链接和线性探测开放寻址和二次探测开放寻址之间时,您还要考虑什么?

无论如何,链接或线性探测都不是一个好兆头.因此,我要考虑的第一件事是通过使用良好的散列函数和合理的散列大小来确保冲突的概率最小.

我要考虑的第二件事是即用型解决方案.当然,当您需要自己的实施时,仍然可能会出现一些罕见的情况......

不确定语言,但这里有使用BSD许可证的快速哈希表实现:http://dpdk.org/browse/dpdk/tree/lib/librte_hash/rte_cuckoo_hash.h

因此,如果你仍然需要自己的哈希表实现并且你关心性能,那么下一个很容易实现的方法是使用缓存对齐的桶而不是普通的哈希元素.每个元素会浪费几个字节(即每个哈希表元素长度为64字节),但是在发生冲突的情况下,至少有几个密钥会有一些快速存储.管理这些存储桶的代码也会有点复杂,所以考虑一下你是否值得为之烦恼......



1> Andriy Beres..:

对不起,由于问题非常广泛,答案也会非常通用,有些链接可以提供更详细的信息.

最好从问题开始:

缓存在哪里使用?

在现代CPU上,缓存随处可见:读取程序指令和读取/写入内存中的数据.在大多数CPU上,缓存是透明的,即不需要显式管理缓存.

缓存是比主存储器(DRAM)更快.为了给您一个透视图,访问1级缓存中的数据大约是4个CPU周期,而访问同一CPU上的DRAM大约是200个CPU周期,即快50倍.

缓存在称为缓存行的小块上运行,缓存行通常为64字节长.

更多信息:https://en.wikipedia.org/wiki/CPU_cache

是什么导致链接具有错误的缓存性能?

基本上,链接不是缓存友好的.这不仅仅是哈希表中的这种情况,与"经典"列表相同.

散列键(或列表节点)彼此远离,因此每个键访问都会产生"高速缓存未命中",即缓慢的DRAM访问.因此,检查链中的10个密钥需要10个DRAM访问,即200 x 10 = 2000我们的通用CPU的循环.

next在当前密钥中读取指针之前,不知道下一个密钥的地址,因此优化空间不大......

为什么开放寻址会提供更好的缓存性能,因为我看不到缓存是如何进入的?

线性探测是缓存友好的.密钥"聚集"在一起,因此一旦我们访问第一个密钥(慢速DRAM访问),很可能下一个密钥将已经在缓存中,因为缓存行是64字节.因此,使用开放寻址访问相同的10个密钥需要1个DRAM访问和9个缓存访问,即200 x 1 + 9 x 4 = 236我们的通用CPU的循环.对于链式密钥,它比2000个周期快得多.

此外,由于我们以可预测的方式访问内存,因此可以进行缓存预取等优化:https://en.wikipedia.org/wiki/Cache_prefetching

在决定链接和线性探测开放寻址和二次探测开放寻址之间时,您还要考虑什么?

无论如何,链接或线性探测都不是一个好兆头.因此,我要考虑的第一件事是通过使用良好的散列函数和合理的散列大小来确保冲突的概率最小.

我要考虑的第二件事是即用型解决方案.当然,当您需要自己的实施时,仍然可能会出现一些罕见的情况......

不确定语言,但这里有使用BSD许可证的快速哈希表实现:http://dpdk.org/browse/dpdk/tree/lib/librte_hash/rte_cuckoo_hash.h

因此,如果你仍然需要自己的哈希表实现并且你关心性能,那么下一个很容易实现的方法是使用缓存对齐的桶而不是普通的哈希元素.每个元素会浪费几个字节(即每个哈希表元素长度为64字节),但是在发生冲突的情况下,至少有几个密钥会有一些快速存储.管理这些存储桶的代码也会有点复杂,所以考虑一下你是否值得为之烦恼......


推荐阅读
  • Yii数据库缓存实例分析【PHP】
    后端开发|php教程Yii,数据库,缓存后端开发-php教程源码zhijia,vscodec必备工具,ubuntu设置fat,tomcat链接被关闭,海淀爬虫,php5.6安装扩展 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • LVS实现负载均衡的原理LVS负载均衡负载均衡集群是LoadBalance集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端 ... [详细]
  • Glide—缓存基础原文:CachingBasics作者:NormanPeitek翻译:Dexter0218我们学习完了加载、显示和处理图片,我们将会向前推进学习优化处理。一个成功 ... [详细]
  • 基于PgpoolII的PostgreSQL集群安装与配置教程
    本文介绍了基于PgpoolII的PostgreSQL集群的安装与配置教程。Pgpool-II是一个位于PostgreSQL服务器和PostgreSQL数据库客户端之间的中间件,提供了连接池、复制、负载均衡、缓存、看门狗、限制链接等功能,可以用于搭建高可用的PostgreSQL集群。文章详细介绍了通过yum安装Pgpool-II的步骤,并提供了相关的官方参考地址。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 解决Sharepoint 2013运行状况分析出现的“一个或多个服务器未响应”问题的方法
    本文介绍了解决Sharepoint 2013运行状况分析中出现的“一个或多个服务器未响应”问题的方法。对于有高要求的客户来说,系统检测问题的存在是不可接受的。文章详细描述了解决该问题的步骤,包括删除服务器、处理分布式缓存留下的记录以及使用代码等方法。同时还提供了相关关键词和错误提示信息,以帮助读者更好地理解和解决该问题。 ... [详细]
  • 【MyBatis系列7】原来SqlSession只是个甩手掌柜,真正干活的却是Executor等四大对象
    Executor原理分析前言MyBatis架构分层ExecutorBaseExecutorSimpleExecutorReuseExecutorBatchExecutor三种常用批 ... [详细]
  • Chrome浏览器非常强大,使用Chrome浏览器对页面性能进行检测,根据测试的结果进行优化。当然这个结果只是参考,在实际的项目中肯定有特殊情况存在,并不能为了满足某项测试结果而忽略特定情况的存在。1 ... [详细]
  • smarty(模板引擎,模板技术)使用smarty主要是为了实现逻辑和外在内容的分离;特点:1、速度快 ... [详细]
  • SpringCloudGateway扩展动态路由路由配置配置文件spring:application:name:sc-gwcloud:nacos:discovery:serv ... [详细]
  • Ihaveconfiguredmycacheasfollows:我已按如下方式配置缓存:@Configuration@EnableCachingpublicclassCach ... [详细]
author-avatar
981378224_014f95
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有