время выполнения flush () для выходного потока

1

Я пытаюсь представить решение (используя какой-то онлайн-компилятор с ограничениями времени компиляции) для сортировки array- вот мой код snippet-

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 (автоматический flushing- new PrintWriter(System.out, true);), компилятор показывает TIME LIMIT EXCEEDED.

Мой вопрос: как я должен использовать flush() чтобы получить лучшее время компиляции?

  • 1
    Что может компилировать время, возможно, связано с PrintStream ?
Теги:
flush

1 ответ

2

Вы отправляете код, и он впоследствии выполняется где-то, поэтому у вас есть исключение TIme Limit Exceeded.

Причина, по которой вы не получаете этого исключения, если отключить автоматическую промывку, проста, как только вы посмотрите на то, что на самом деле означает флеш. flush блокирует ваш код и ждет, пока все, что было написано в потоке, также не попало в поток к нему (в этом случае System.out).

Если у вас включена автоматическая промывка, она будет смываться после каждой команды println. Поэтому после каждого println ваше приложение блокирует и ожидает, что Java VM или система Host пересылают вашу строку в System.out.

Если вы отключили автоматическую промывку, строки println будут сохранены в памяти. В зависимости от реализации потока он все равно может попытаться вымыть данные из памяти в фоновом режиме, но это не обязательно. В конце вашего приложения вы будете писать все свои строки сразу (через flush). Это происходит быстрее из-за меньших контекстных переключателей и потому, что оно не блокирует ваше приложение от запуска цикла.

  • 0
    Да! То же самое и в случае Print Stream (System.out.println ()). Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню