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