私は単純な再帰的な方法、深さの最初の検索している。それぞれの呼び出しで、それがリーフにあるかどうかをチェックし、そうでなければ、現在のノードを展開し、子でそれ自身を呼び出します。Javaの奇妙なパフォーマンスの不一致
私はそれを平行にしようとしていますが、私は次の奇妙な(私にとっては)問題に気付いています。
私はSystem.currentTimeMillis()で実行時間を測定します。
検索をいくつかのサブアークに分割し、実行時間を合計すると、順次検索よりも大きな数字が得られます。私は実行時間、通信や同期などを測定しません。私はサブタスクの時間を追加するときに同じ時間を得ることが期待されます。これは、たとえスレッドを使わずに他のタスクを実行したとしても発生します。検索をいくつかのサブタスクに分割して、サブタスクを順番に実行すると、より大きな時間が得られます。 サブタスクのメソッド呼び出しの数を追加すると、私は逐次検索と同じ番号を取得します。だから、基本的には、どちらの場合でも同じ数のメソッド呼び出しを行いますが、私は異なる時を得ます。
最初のメソッド呼び出しやJVMメカニズムに起因する何らかのオーバーヘッドがあると思います。どのようなアイデアでもありますか? たとえば、1回の順次検索には約3300ミリ秒かかります。私が13のタスクに分割すると、合計時間は3500msになります。
私の方法は、次のようになります。私はそれを呼び出すたび
private static final int dfs(State state) {
method_calls++;
if(state.isLeaf()){
return 1;
}
State[] children = state.expand();
int result = 0;
for (int i = 0; i < children.length; i++) {
result += dfs(children[i]);
}
return result;
}
、私はこのようにそれを行う:
for(int i = 0; i < num_tasks; i++){
long start = System.currentTimeMillis();
dfs(tasks[i]);
totalTime += (System.currentTimeMillis() - start);
}
問題はnum_tasksとTOTALTIME増加であり、私はので、同じとどまることを期待しますmethod_calls変数は同じままです。
それはあなたがやっていることは本当にはっきりしていない - しかし、あなたは完全なコードを投稿することができれば、それは本当に役立つだろう。 –
スレッドの作成は無料ではありませんか?スレッドを事前に作成してプールを使用する(または[ThreadPoolExecutor](http://docs.oracle.com/javase/6/docs/apc/java/util/concurrent/ThreadPoolExecutor.html)) –
@BrianRoach私私はそのメソッドの実行時間だけを測定しています。スレッドオーバーヘッドとは関係ありません。私はちょうど1つのスレッドを使用し、それぞれのサブタスクを次々に呼び出す場合にも発生します – user16367