ExecutorService性能问题

时间:2014-03-26 08:30:40

标签: java multithreading concurrency multiprocessing executorservice

我试图用Java Executor框架弄脏自己。所以我创建的任务只是字符串操作

使用for循环

for(int i = 0; i < noOfTimes; i++)
    str = str + 't';

现在我的计划是连续执行此任务(逐个执行for循环)并行执行(使用Executor框架并立即提交所有作业并让它运行) 并且比较了他们的表现。所以我在测试用例下执行。我有8GB内存的机器和处理器 - 英特尔i7,我认为它有8个内核。

1.无任务(任务) - 30000,每项任务将循环1000(noOfTimes)

  • a.Serially - 21.619
  • b执行者框架 - 差不多13.8秒

2.没有任务(任务) - 30000并且每个任务将循环5000(noOfTimes)

  • a.Serially - 433.34000000000003 secs
  • b执行者框架 - 差不多325秒

3.没有任务(任务) - 5000并且每个任务将循环15000(noOfTimes)

  • a。Serially(单核) - 661秒
  • b执行者框架(多核) - 1154秒

案例1&amp;正如预期的那样,它清楚地表明,与串行执行相比,多线程方法花费的时间更少 但案例3几乎是反向的。所以我有以下问题

1。什么时候我们应该采用串行执行或多线程方法(利用Exrofor框架的多核机器)   用于处理大量数据(假设我想处理30000个员工记录)

2。我在上面的测试案例中观察到,在单个任务处理不耗时(循环1000次)的情况下,多线程方法要快得多 但是一旦我增加了单个任务的处理时间(循环15000),与串行执行相比,它几乎花费了两倍的时间。

3。我想检查http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/中提到的任务管理器中的CPU使用率 但CPU没有100%使用所有核心?

1 个答案:

答案 0 :(得分:0)

首先,您应该尝试其他测试。

String是不可变的,所以做str = str + "t"实际上并不是线性的:只添加一个字符意味着每次重建整个字符串。

另外因为Java中的字符串池,我不是100%肯定String是测试并发性的最佳对象。

其次,并发性增加了程序的复杂性以及诸如死锁,竞争条件等计划外行为的风险......糟糕的并发设计可能效率低于平均串行设计。

因此,如果您对自己的计划感到满意并且表现不错,请不要多线程。如果您对性能不满意,请首先尝试找出原因并改进您的串行设计。只有这样你才能添加多线程,但你真的需要知道你在做什么。