我试图解决Euler Project 。要点here 。是的,我明白了,没有使用任何算法 - 我并没有尝试这样做。问题是,第二个文件正在使用 ExecutorService 来查找值 - 我知道结果不会正确,但与单线程文件相比,它正在爬行。我认为创建线程本身可能会产生开销,将池大小减少到 4(我有一个八核处理器),但这没有任何作用。
之前我也用过similar approach 使用多线程显着加快缩略图生成速度。但我无法理解是什么导致了这种特殊情况的缓慢。我并不是想得到正确的解决方案 - 我知道我应该先这样做,然后再尝试其他任何事情。我到底做错了什么。我来这里并不是为了找到问题的解决方案,但我想了解为什么它很慢。我使用了由线程访问的静态变量。这会是一个问题吗?
最佳答案
I understand that the result will not be correct but it is crawling compared to single threaded one
I kill the program after 5-6 minutes of execution since it is running very slowly
首先,我假设您使用的是 Executors.newFixedThreadPool()
它分配固定数量的线程,而不是缓存的线程池。
在我看来,您可能正在创建大量作业,并且您的程序内存不足。当你填满内存时,JVM 会越来越努力地进行 GC,这会随着你的进程变得越来越慢而显现出来。您可以使用 jconsole 连接到应用程序来验证线程数和内存。您还可以对其进行线程转储 ( kill -QUIT pid
) 并查看您 fork 了多少个作业。
如果您正在创造大量就业机会,并且您的ExecutorService
只是跟不上,那么你就需要限制工作生产。有几种不同的方法可以做到这一点。这是我使用的:
从那里链接了几个其他解决方案。
I thought creating threads itself might have overhead reduced the pool size to 4 (I have an eight core processor) but that did nothing.
是的,这看起来不像是处理器问题。我会将其移回 8。如果这确实使该框无法使用,请尝试在 ExecutorService
中使用 7 或 6 个线程。 .
编辑:
仔细查看代码后,您正在执行一堆不同步的数据更新,这将导致奇怪的结果。每当您修改共享内存(在您的情况下为共享 static
字段)时,您都必须在互斥体( ++
)和内存共享方面进行一些同步。
我会考虑使用AtomicLong
和其他如果可以的话,但您应该阅读一些有关共享内存和同步的线程教程:http://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
关于java - 多线程程序运行速度比单线程程序慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22644368/