Java system.out против нового PrintStream - PullRequest
1 голос
/ 03 сентября 2010

Что использовало бы больше памяти, если бы оно выводило сообщение длиной 15 000 строк?

Сможет ли System.out.println использовать больше памяти?или System.setErr (new PrintStream (new FileOutputStream ("tonsoflines.log"))) будет использовать больше памяти?

Что использует больше процессов или требует больше памяти для работы?Визуальный вывод в окне консоли или запись в файл без визуальной консоли?

Редактировать: Кроме того, какой из них первым завершит сообщение?

Ответы [ 3 ]

2 голосов
/ 03 сентября 2010

Консоль

Как некоторые тесты: печать в System.out результат:

Printing line : #0
.
.
.
Printing line : #14997
Printing line : #14998
Printing line : #14999
System.out took: 238ms
  • Тест № 1: 238ms
  • Тест #2: 235ms
  • Тест № 3: 251ms
  • Тест № 4: 210ms
  • Тест № 5: 172ms
  • Тест № 6: 268ms

новый поток

И использование нового Stream результат:

Printing line : #0
.
.
.
Printing line : #14996
Printing line : #14997
Printing line : #14998
Printing line : #14999
System.out with new stream took: 220ms
  • Тест № 1: 220ms
  • Тест № 2: 219ms
  • Тест № 3: 222ms
  • Тест № 4: 220ms
  • Тест# 5: 223ms
  • Тест № 6: 250ms

Код

    try {

        System.setOut(new PrintStream(new FileOutputStream("C:\\TMP\\logs.log")));
                    long startTime = Calendar.getInstance().getTimeInMillis();
        for (int a=0;a<15000;a++) {
            System.out.println("Printing line : #"+a);
        }

        long elapsedTime = (Calendar.getInstance().getTimeInMillis() - startTime);
        System.out.println("System.out took: " + elapsedTime + "ms");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

Как видите, разница в скорости неи даже «сделка». Что я не проверял, так это производительность (дисковый ввод-вывод, память и процессор) с использованием этих методов.

Но если вы спросите меня о том, что я думаю, я скажу, чторезультат будет что-то вроде теста скорости, который мы только что выполнили ... Для моих журналов в любом приложении, я использую код, я использую Log4J (http://logging.apache.org/log4j/1.2/index.html), чтобы регистрировать все, что я хочу, и вы можетеустановить уровень входаВы хотите (отладка, информация, ошибка и т. д.)

2 голосов
/ 03 сентября 2010

Я думаю, что с точки зрения памяти разница будет минимальной, может быть, небольшим преимуществом для System.out.println. С точки зрения обработки и скорости, запись в файл журнала будет намного быстрее, чем распечатывать все на экране.Большинство каркасов журналирования для Java оптимизированы для максимальной производительности во время операций логирования, поэтому вам определенно стоит использовать для этого хорошую инфраструктуру логирования, такую ​​как Log4J.

0 голосов
/ 03 сентября 2010

System.out является объектом PrintStream .Поэтому я не думаю, что будет большая разница.

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#out

public static final PrintStream out

«Стандартный» поток вывода.Этот поток уже открыт и готов принять выходные данные.Обычно этот поток соответствует выводу на экран или другому назначению вывода, указанному хост-средой или пользователем.

Если вы рассматриваете это для ведения журнала, всегда рекомендуется использовать специализированную структуру ведения журнала, такую ​​как Log4J .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...