【问题标题】:When does performing tasks in parallel is an overkill? [closed]什么时候并行执行任务是多余的? [关闭]
【发布时间】:2015-04-14 16:51:34
【问题描述】:

我有一段 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();
    }

【问题讨论】:

  • EXEC 是如何定义的?
  • test.m1()在做什么工作?
  • ExecutorService EXEC = Executors.newCachedThreadPool();
  • m1() 只是在解析描述中提到的一些 xml。
  • 我几乎可以肯定,将其搁置,因为基于意见是没有根据的。但由于我不能再发布答案:This 可能有助于确定您的任务至少应该在您的硬件上持续多长时间。

标签: java multithreading performance concurrency parallel-processing


【解决方案1】:

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

当并行计算开始有意义时,粗略估计(在 10 倍以内)是 100 微秒的顺序执行。尽管还有更多的因素需要考虑。

【讨论】:

  • 这更像。我来看看。谢谢:)
【解决方案2】:

简短回答:当您没有性能或 IO 阻塞问题时,这太过分了。

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

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

【讨论】:

  • 我的任务不需要它们之间的任何协调。阿姆达尔定律有帮助。但我希望得到一些近似的性能数字或由某人在他们的机器上测试的图表。如果可能的话,在 Java 中。在 linux 上说,如果一个方法需要 500 微秒来执行并且我需要循环执行 100 次,那么使用 fixedThreadPool 并行执行它们是有意义的。
  • @Mr.White 如果您有性能问题,请先分析您的应用程序以解决瓶颈
猜你喜欢
  • 2017-01-26
  • 1970-01-01
  • 2021-07-22
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多