关于性能,假设我们获得了每个线程可以频繁访问的数据块,并且这些数据是只读的,这意味着线程除了读取数据之外不会做任何事情。
那么为每个线程创建这些数据的一个副本(假设数据是只读的)是否有益?
如果所有线程共享频繁访问的数据(而不是每个线程一个副本),那么这会增加这些数据被正确缓存的可能性吗?
答案 0 :(得分:8)
每个线程的只读数据的一个副本对缓存没有帮助;恰恰相反,当线程在相同的多核(可能是超线程)CPU上执行并因此共享其缓存时,它会受到伤害,因为在这种情况下,数据的每个线程副本可能会竞争有限的缓存空间。
然而,在多CPU系统的情况下,现在几乎所有这些都是NUMA,通常每个CPU内存库在“本地”和“远程”内存之间的访问成本有所不同,它可能是有益的有一个 per-CPU 只读数据的副本,放在本地存储库中。
内存映射由操作系统控制,因此如果你走这条路,研究操作系统的NUMA相关行为是有意义的。例如,Linux使用第一触摸内存分配策略,这意味着内存映射不在malloc
,而是在程序第一次访问内存页时,OS尝试从本地银行分配物理内存。
通常的表现格言适用:衡量,不要猜测。