输出流的flush()运行时间

时间:2014-11-21 13:56:26

标签: java flush

我正在尝试提交解决方案(使用一些具有编译时间限制的在线编译器)来排序数组 - 这是我的代码片段 -

class TSORT {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter bw = new PrintWriter(System.out, false);
        int t = Integer.parseInt(br.readLine());
        int[] list = new int[1000001];      
        for(int i = 0; i < t; i++){
            int n = Integer.parseInt(br.readLine());
            list[n]++;
        }
        int r=0;
        for(int i = 0; i < 1000001; i++){
            if(list[i] > 0){

                for(int j = 0; j < list[i]; j++){
                    bw.println(i);      // if I use bw.flush() here, time limit gets exceeded.

                }
            }
    }
        bw.flush();
    }
}

此代码已成功提交,但如果我使用flush()为true(自动刷新 - new PrintWriter(System.out, true);),编译器会显示TIME LIMIT EXCEEDED。

我的问题是 - 如何使用flush()来获得最佳编译时间?

1 个答案:

答案 0 :(得分:2)

您正在提交代码,然后在某处执行,这就是为什么您有 TIme Limit Exceeded 例外。

如果你禁用自动刷新,你没有得到这个例外的原因很简单,一旦你看看flush实际意味着什么。 flush阻止您的代码并等待,直到写入流的所有内容都通过流到达目标(在本例中为System.out)。

如果您启用了自动刷新功能,则会在每次println命令后刷新。因此,在每个println应用程序阻塞并等待Java VM或主机系统将您的字符串转发到System.out之后。

如果您关闭了自动刷新功能,则println的字符串会缓存在内存中。根据流的实现,它仍然可以尝试在后台刷新内存中的数据,但它不必。在您的应用程序结束时,您将立即写入所有字符串(通过flush)。由于较少的上下文切换以及它不会阻止您的应用程序运行循环,因此速度更快。