我有一个非常大的单例对象,它包含一个2500 X 80000双数组。当我尝试在多线程环境中访问它时,随着线程数量的增加,访问对象的时间也会增加。如果有办法我可以保持对象的访问时间相同,而不管线程的数量。
我只是在读数组。阵列中没有进行任何更改。代码中没有同步
答案 0 :(得分:1)
问题的一个可能原因是无效的缓存。缓存取决于线程在有足够的其他缓存活动将线路移出缓存之前返回到线路。随着线程数量的增加,线程重用线路的概率会下降。
如果可能的话,以自然顺序访问数组,第二个索引变化最快。这会尽快重用行,并减少每个线程运行良好的缓存空间量。
尝试的可能解决方案是使用例如一个信号量,用于将同时读取数组的线程数限制为提供最高吞吐量的数字。这可能大于一,但不会无限制。
另一个解决方案是增加处理器的数量,从而增加缓存空间,与线程数成比例。
第三种选择是重新使用这么多线程。拥有一个有限的线程池和一个任务队列可能会更有效率。
答案 1 :(得分:1)
如果你所做的只是阅读,那么你就拥有了最有效的解决方案软件。更可能是一个问题是你正在耗尽资源,例如你有比CPU更多的线程,或者你有更多的数据可以有效地适应你的缓存。
例如,如果您有一个线程,它可以完全访问您的L3缓存,例如12 MB。如果你有两个线程,如果没有重叠,每个cpu可以使用一半的缓存。如果你有24个线程,那么每个CPU只有0.5 MB,它必须共享一个高度竞争的资源。
在我已经完成的测试中,您可以使用2-3个线程来最大化L3缓存的带宽,具体取决于您的操作。
顺便说一下:如果你这样做,你应该会获得更好的缓存效率。
我只是在读数组。阵列中没有进行任何更改。代码中没有同步
在某个地方,我看到每个关键线程都在自己的机器上运行。这将保证您的持续表现。但我怀疑,您需要考虑哪些选项可以充分利用您的硬件并实现您的硬件有限制(例如您的预算;)
答案 2 :(得分:0)
我终于找到了解决问题的方法。我没有将数据存储在二维数组中,而是将数据存储在单维数组中,结果比在二维数组中存储数据快得多。显然,java不像单维数组那样有效地处理双维数组。