【问题标题】:parallelize Java program并行化 Java 程序
【发布时间】:2015-04-14 16:31:42
【问题描述】:

如何在 Java 上并行化程序,以使并行版本的执行时间(远)小于没有线程的程序的执行时间? 我试过了,例如ExecutorService ("Parallel.For" for Java?) 但它的工作时间大约长 3 倍

问题是我在 Java 中使用线程不当,还是使用 2 核获得 2 倍加速是不真实的(这可能使用 4 核吗?)?

附:我需要并行化while循环

【问题讨论】:

  • 没有看到你的代码就无法回答 - 问题可能是由于多种原因......

标签: java multithreading parallel-processing acceleration


【解决方案1】:

我会向你推荐这个帖子,因为它在这个主题上非常详细:[Java 8's streams: why parallel stream is slower?

总而言之,并行性会给任何进程带来开销和复杂性,虽然并行化肯定会带来好处,但它不会在 2 个内核上实现 2 个线程 = 快 2 倍。

【讨论】:

    【解决方案2】:

    多线程编程在以下情况下很有用:

    • 在内存操作密集时需要多核系统(如果有如下长 I/O 操作则不需要)
    • 数据库操作(执行查询)
    • 网络操作(如发送文件或调用网络服务)
    • 文件操作(读写文件)

    如果您不是上述情况之一,则添加多线程会导致应用程序变慢,因为在进程之间切换会产生开销。

    【讨论】:

    • 这充其量是一种误导:在文件操作上使用多线程很可能会变慢。在计算密集型任务上使用多线程应该在您的列表中。
    • 在读写文件之类的文件操作中使用多线程并不慢。通常,当 CPU 未以 100% 使用时,多线程总是有用的。这经常发生在任何非内存操作中。在单核系统(一个 cpu)中对密集型任务使用多线程是没有用的。我编辑我的帖子以更清楚。
    • 回复。文件读写,假设我们谈论的是本地硬盘驱动器,瓶颈是硬盘驱动器 - 向它抛出更多线程只会减慢它的速度......例如:stackoverflow.com/questions/8584797/…
    • 这取决于很多因素。您可以在内存中读取文件和执行后续操作,并将结果保存到远程数据库。您可以通过多线程有效地做到这一点。从文件中读取是一项缓慢的操作,因此如果您在内存中执行较长的操作,您可以使用从文件中读取数据所需的时间来详细说明之前已经读取的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 2011-09-28
    • 2011-10-25
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多