2

アルゴリズムの実行にかかる時間を調べるために、メイン メソッドでこれを行いますが、System.print とインターリーブされるため、時間を出力しません。

long startTime = System.currentTimeMillis();     
A1.Print(2);
long endTime = System.currentTimeMillis();
System.err.print(endTime - startTime);

クラスAがこれである場合:

public class A{

    public void Print(int n){
        for(int i = 0; i <=n; i++){
        System.out.println(i)
    }
}

それは印刷します

0

1

2

この行では、そのループを通過するはずの時間ですが、単純にそうではないため、次のようには出力されません。

0

1

2

1

ここで、最後の行または 1 は、アルゴリズムにかかったミリ秒です。教科書には、System.err を使用しなければならないと書かれています。インターリーブを防ぐ方法を見つけます。

4

4 に答える 4

5

次のようなことができます

System.setErr(System.out);

したがって、出力は同じストリームにあります。それらは 2 つの異なるストリームを使用するため、インターリーブが発生します。

あなたのコードでは、次のようになります。

long startTime = System.currentTimeMillis();    
System.setErr(System.out); 
A1.Print(50);
long endTime = System.currentTimeMillis();
System.err.print(endTime - startTime);
于 2013-04-09T05:47:53.447 に答える
2

System.err&System.out異なるバッファを使用するため (OS に依存)、これらのバッファは異なる時間にフラッシュされる可能性があります。したがって、インターリーブ出力が得られる可能性があります。

また、System.err はデフォルトでコンソールに送信されることが保証されておらず (System.out とは異なり)、コンソールまたはファイル システムにリンクされている可能性があります。

これを解決するには、次の場所System.errにリンクすることをお勧めしますSystem.out

お気に入り

System.setErr(System.out);

また

System.setErr(System.console());
于 2013-04-09T05:48:25.647 に答える
1

Eclipse を使用している場合、これは既知のバグです: https://bugs.eclipse.org/bugs/show_bug.cgi?id=32205。コマンドラインから同じことを試してください

于 2013-04-09T05:48:20.493 に答える
0

System.err.printlnの代わりに使用する必要がありSystem.err.printます。行全体を取得するまで、単にバッファリングしている可能性があります。

于 2013-04-09T05:47:21.230 に答える