java - 多线程程序运行速度比单线程程序慢

标签 java multithreading performance

我试图解决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只是跟不上,那么你就需要限制工作生产。有几种不同的方法可以做到这一点。这是我使用的:

Process Large File for HTTP Calls in Java

从那里链接了几个其他解决方案。

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/

相关文章:

带有 (C++) 子进程/线程或类似的 Java 进程

java - eclipse : saved LaunchConfiguration overrides LaunchType

c - Pthread 服务器编程 : how to release a thread which is blocked on a recv call to handle a request from another thread

iphone - UISearchDisplayController 和大量数据的搜索性能

mysql - 记录 mysql 查询

java - 从 Fragment 中完全删除 Action Bar

java - 如果当前线程 hibernate ,ThreadPoolExecutor 是否会生成新线程

c# - .Net TableLayoutPanel – 清除控件非常慢

mysql - 是否有用于 C 的标准 mysql 连接池库?

java - 将java bean写入Csv表格式