0

私の質問は非常に単純です:

私はUbuntuに取り組んでおり、Javaで(Eclipse IDEを使用して)プログラムを作成しました。このプログラムはどこにも何も読み書きしません。多くの計算を行い、自家製のクラスの多くのインスタンスを作成するだけです。プログラムの出力は単純です:端末にA、B、またはCを書き込みます(ランダムプロセスと見なします)

Aを1000000回取得し、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 )を試しましたが、どのように機能するのかわかりません。

私がこれまでに持っている唯一のアイデアは、ターミナルでコマンド「java Main&java Main&java Main&java Main&java Main&java Main&java Main&java」を使用してプログラム(Aから100000まで)を10回要求することです。 Main&java Main&java Main "しかし、BとCのオカレンスの合計を手動で作成する必要があります。これを行うためのより良い方法があると確信しています!(A)、B、Cの値で10個のファイルを作成し、それらをすべて読んで要約することを考えました。整数を合計するだけでも、本当に大変な作業ですよね。

転送していただきありがとうございます、私は助けを待っています:D

ps:簡単に答えるために、到達したいAIの数を表すint引数のみを取る「prog」という名前のプログラムがあると考えてみましょう。

4

3 に答える 3

0

単一のマシンでは、複数のプロセスと比較して、複数のスレッドを使用する場合、並列処理の方が効率的です。

ただし、シングルコア/シングルCPUシステムで実行する場合、並列処理によってパフォーマンスが低下することはわずかですが、純粋な計算ではパフォーマンス上のメリットはありません。-それでも、たとえば複数の低速IOが関係している場合、マルチスレッドは結局プロセスを高速化する可能性があります。

簡単に言うと、マルチプロセッシングは常にマルチスレッドよりも遅くなります。

于 2013-03-08T10:19:21.533 に答える
0

progメソッドのバージョンの1つを使用して起動するメインクラスを作成してみることができますRuntime.exec(...)。これにより、プロセスのoutputStreamを使用して、各プロセスが計算した値をメインプログラムに送信できます。

于 2013-03-08T10:17:18.047 に答える
0

並列化は、マルチコアCPUを使用している場合にのみ意味があります。java.lang.Runtime.availableProcessors()を実行して、実行する必要のあるスレッドの数を確認します。

次に、アプリケーションの内部状態が変化しているため、100000回の繰り返しで10回のバッチを実行することは、1000000回の繰り返しで1回のバッチを実行することと同じではありません。したがって、並列化が適用できるかどうかを検討してください。

A、B、およびCの結果の総数を知るには、すべてのスレッドにAtomicIntegerを使用するだけです。毎回、Aの数が1000000未満かどうかを確認してください。

于 2013-03-09T10:43:28.517 に答える