java – 当我们说某个特定的数据结构是缓存友好的时候是什么意思?
作者:互联网
我经常读到链表数据结构及其变体跳过列表在并行硬件中是缓存友好的.这是什么意思 ?有人可以用一种易于理解的方式解释.
编辑:上下文是在this link.
解决方法:
I often read that linked list data structure and its variant skiplists are cache friendly
链表和类似结构不是CPU缓存友好的,因为每个节点可以随机排列在内存中,导致许多缓存未命中.
相比之下,ArrayList将在内存中顺序包含所有引用,因此当读入缓存行(通常为64字节长)时,它可以一次读取16个引用.
注意:List引用的对象仍然可以随机排列在内存中,这是您无法控制的. :|
从问题中的文章.
Besides being well suited for concurrent traversal and update, linked lists also are cache-friendly on parallel hardware. When one thread removes a node, for example, the only memory that needs to be transferred to every other core that subsequently reads the list is the memory containing the two adjacent nodes.
这是谈论的是当多个线程同时修改链表(Java中的LinkedList不支持)时,只需要修改列表中的节点需要使缓存一致.相比之下,如果在ArrayList的中间或开头删除或添加元素,则需要更新所有引用.已知这是低效的,在任何情况下都最好避免.
Java中最接近它的例子是ConcurrentLinkedQueue,它支持并发添加和删除.问题是,由于此操作会产生更重要的垃圾,但仍然不是很重要,因此可以通过能够根据缓存更新开始和结束而获得的任何好处都会丢失.
如果使用ArrayBlockingQueue,则会获得更好的缓存和垃圾行为,因为引用在内存中是连续的,不需要像ArrayList一样向下移动,也不要创建垃圾来添加条目. (不幸的是,take()会创建一个对象:P)
标签:java,caching,memory,data-structures,java-memory-model 来源: https://codeday.me/bug/20190613/1232015.html