【发布时间】:2012-03-05 03:14:30
【问题描述】:
我在 RAM 中有一个大数组,并希望尽可能快地从中读取数据。忽略任何可能的同步,我只是想知道理论。
将这些读取分散到多个线程上是否比仅使用一个线程更快?
编辑:每个数据点大约 20KB,我无法预测它们的读取顺序。
【问题讨论】:
标签: multithreading performance memory
我在 RAM 中有一个大数组,并希望尽可能快地从中读取数据。忽略任何可能的同步,我只是想知道理论。
将这些读取分散到多个线程上是否比仅使用一个线程更快?
编辑:每个数据点大约 20KB,我无法预测它们的读取顺序。
【问题讨论】:
标签: multithreading performance memory
一般来说:可以,但小心缓存未命中。
假设您有一个 int[]:考虑将其划分为后续元素的范围,并让每个线程都有自己的范围(线程 1 从 0 到 127,线程 2 从 128 到 255,...)。
当您读取数组的一个元素时,执行加载的处理器内核最有可能将数组的一些连续元素加载到其 缓存 中,因为大多数时候它们都在在 (immagine for (int i =0;;i++) do(arra[i])): 如果您不将数据分区为 粗略 那样的话,所有这些工作都将被浪费掉。
您可以在 Joe Duffy 的以下文章中了解更多相关信息:
不严格相关:The 'premature optimization is evil' myth 尤其是“了解重要的数量级”部分
正如@Alex 所说,一般规则是您必须始终衡量并且永远不要假设任何事情:通过并发实现高效可扩展性是一个复杂的主题,需要对底层架构有很多深入的了解。
【讨论】:
只需针对您的具体情况进行测试。毕竟线程的上下文切换是昂贵的。使用单线程方法可能也一样快。
衡量性能,不要猜测。
【讨论】:
技术上是的。您可以使用更多线程从内存中的不同位置读取。 CPU 速度更快,因此它可以发出大量读取,例如每个线程读取一次,直到第一次读取的结果返回。然后开始处理请求。 假设 RAM 没有阻塞,这是可行的;即支持一次多次读取。例如,你的内存只有 1 条输入线和 1 条输出线,那么它就会阻塞,没有多少线程会有所帮助。
现在请记住,您对读取的数据究竟做了什么。如果您通过网络同步发送或将其转储到 HDD,这并不一定意味着您应该使用多线程来读取数据,因为它会成为 write_to_HDD/sendData 的瓶颈。
如果您有另一个 CPU 等待处理检索到的数据,那么您可以很好地瘫痪。同时读取和处理。
【讨论】: