2

为了计算出执行算法需要多少时间,我在 main 方法中执行此操作,但它不会打印时间,因为它与 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);

所以输出在同一个流中。他们使用两个不同的流,所以这就是你得到交错的原因。

对于您的代码,它将是:

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使用不同的缓冲区(取决于操作系统),因此这些缓冲区可能会在不同的时间被刷新。因此可能会给出交错输出。

而且,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 回答