何时并行执行任务是一种过度杀伤力?

时间:2015-04-14 03:27:29

标签: java multithreading performance concurrency parallel-processing

我有一段java代码,它从xml构造一个对象,并根据对象大小需要几纳秒到一毫秒。有时我会在循环中调用该方法1-2次,有时70-80次来构造一个对象列表。

我尝试并行构建对象,但有时它比连续时间和其他时间都要花费两倍的时间。现在我的问题是,是否有任何指南或性能比较指标来指导什么时候应该使用多任务处理以及什么时候只是一个过度杀伤?

我正在使用的示例代码是:

    List<Callable<Integer>> tasks = new ArrayList<Callable<Integer>>();
    for (final Integer object : list) {
        Callable<Integer> c = new Callable<Integer>() {
            @Override
            public Integer call() throws Exception {
                    return test.m1(object);
            }
        };
        tasks.add(c);
    }
    List<Future<Integer>> results = EXEC.invokeAll(tasks);

    for (Future<Integer> fr : results) {
        fr.get();
    }

2 个答案:

答案 0 :(得分:1)

简短回答:如果您没有遇到性能或IO阻止问题,那就太过分了。

关于并行性能的几个因素是:

  • 任务之间需要多少沟通/协调。有关协调最少的示例,请参阅Embarrassingly parallel
  • 并行处理的结构需要时间来创建。例如OSX Thread takes about 90 microseconds要创建,所以你需要保存至少那么多(如果你创建一个)。
  • 并行处理不会加快顺序分数。如果任务需要一个小时,并且只有75%的任务可以并行处理,那么您将无法在不到15分钟的时间内完成任务。见Amdahl's law

答案 1 :(得分:1)

看看Doug Lea的帖子"When to use parallel streams"

当并行计算开始有意义时,粗略估计(在十分之一内)是顺序执行的 100微秒。虽然还有很多因素需要考虑。