我在RAM中有一个大型阵列,想尽快从中读取数据。忽略任何可能的同步,我只对理论感到好奇。
将这些读取分布到多个线程比仅使用一个线程更快吗?
编辑:每个数据点大约20KB,我无法预测它们的读取顺序。
最佳答案
一般而言:是,但要注意缓存未命中。
假设您有一个int []:考虑在后续元素的范围内对其进行分区,并让每个线程获得其自己的范围(thread1从0到127,thread2从128到255,...)。
当您读取数组的一个元素时,执行加载的处理器内核最有可能在其缓存中加载该数组的某些连续元素,因为在大多数情况下,紧接着需要它们(请想象(int i = 0 ;; i++)do(arra [i])):如果不以粗方式对数据进行分区,那么所有这些工作都将被浪费掉。
您可以在Joe Duffy的以下文章中了解有关此内容的更多信息:
并非严格相关:The 'premature optimization is evil' myth特别是“了解重要的数量级”部分
正如@Alex所说,一般规则是您必须始终衡量并且绝不承担任何责任:通过并发进行有效的可伸缩性是一个复杂的主题,并且需要对基础架构进行大量深入的了解。
关于multithreading - 多线程内存访问是否可以提高性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265267/