0

我的问题很简单:

我在 Ubuntu 上工作,我用 Java 编写了一个程序(使用 Eclipse IDE)。该程序不会在任何地方读取或写入任何内容,它只是进行大量计算并创建许多自制类的实例。程序的输出很简单:它在终端中写入A、B或C。(认为它是一个随机过程)

我必须重复运行程序,直到我得到 1000000 次 A 并计算我得到 B 和 C 的次数。我做到了,它有效,但它太慢了。

例如:输出为:“A:1000000 B:1012458 C:1458”

这是我需要你帮助的地方:

我想并行化程序。我尝试了多线程,但它没有更快地工作!所以,虽然每个模拟都是独立的,但我想进行多重处理。例如,我想创建 10 个进程并要求他们运行程序,直到 A 出现 100000 次。(所以我想要的 10 * 100000 = 1000000)问题是我需要知道 B 和 C 的总数,现在我得到了每个 10 的值。

我能怎么做?我尝试了 ProcessBuilder ( http://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html ) 但我不明白它是如何工作的!

到目前为止,我唯一的想法是在终端中使用以下命令询问我的程序(A 直到 100000)10 次:“java Main & java Main & java Main & java Main & java Main & java Main & java Main & java Main & java Main & java Main" 但是我必须手动计算 B 和 C 出现的总和。我相信有更好的方法来做到这一点!我考虑过创建 10 个值为 (A)、B 和 C 的文件,然后读取所有文件并对其进行总结,仅对某个整数求和确实需要大量工作,不是吗?

谢谢转发,我正在等待帮助:D

ps:为了方便回答,假设我有一个名为“prog”的程序,它只接受代表 AI 想要达到的数量的 int 参数。

4

3 回答 3

0

在单台机器上,与多进程相比,使用多线程的并行处理效率更高。

然而,在单核/单 CPU 系统上运行时,并行处理只会带来很小的性能损失,但对于纯计算并没有性能优势。- 然而,当涉及多个慢速 IO 时,多线程毕竟可能会加快进程。

简而言之:多处理总是比多线程慢。

于 2013-03-08T10:19:21.533 回答
0

您可以尝试创建一个prog使用其中一种方法版本启动您的主类Runtime.exec(...)。这样,您可以使用其进程的 outputStream将每个进程计算的值传输到主程序。

于 2013-03-08T10:17:18.047 回答
0

仅当您拥有多核 CPU 时,并行化才有意义。运行 java.lang.Runtime.availableProcessors() 以了解您应该运行多少线程。

然后,运行 10 批 100000 次重复与运行一批 1000000 次重复是不一样的,因为您的应用程序的内部状态正在发生变化,因此请考虑并行化是否适用于您的情况。

要知道 A、B 和 C 结果的总数,只需对所有线程使用 AtomicInteger。每次检查 A 的计数是否小于 1000000。

于 2013-03-09T10:43:28.517 回答