Вопрос: Почему печать «B» значительно медленнее, чем печать «#»?


Я породил две матрицы 1000Икс 1000:

Первая матрица: Oа также #,
Вторая матрица: Oа также B,

Используя следующий код, первая матрица заняла 8.52 секунды:

Random r = new Random();
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        if(r.nextInt(4) == 0) {
            System.out.print("O");
        } else {
            System.out.print("#");
        }
    }

   System.out.println("");
 }

С помощью этого кода вторая матрица заняла 259,152 секунды:

Random r = new Random();
for (int i = 0; i < 1000; i++) {
    for (int j = 0; j < 1000; j++) {
        if(r.nextInt(4) == 0) {
            System.out.print("O");
        } else {
            System.out.print("B"); //only line changed
        }
    }

    System.out.println("");
}

В чем причина резкого разгона?


Как указано в комментариях, только печать System.out.print("#");принимает 7.8871секунд, тогда как System.out.print("B");дает still printing...,

Как и другие, кто указал, что он работает для них нормально, я попробовал Ideone.com например, и обе части кода выполняются с одинаковой скоростью.

Условия испытаний:

  • Я провел этот тест с Netbeans 7.2 , с выходом в консоль
  • я использовал System.nanoTime()для измерений

2387


источник


Ответы:


Чистая спекуляция заключается в том, что вы используете терминал, который пытается сделать слово-обертывание а не обертывание символов и Bкак символ слова, но #как символ без слова. Поэтому, когда он достигает конца строки и ищет место для разрыва линии, он видит #почти сразу и счастливо ломается там; тогда как с B, он должен продолжать поиск дольше и может иметь больше текста для обертывания (что может быть дорогостоящим на некоторых терминалах, например, выводить обратные пространства, а затем выводить пробелы для перезаписывания переворачиваемых букв).

Но это чистое предположение.


3685



Я провел тесты на Eclipse vs Netbeans 8.0.2, как с Java версии 1.8; я использовал System.nanoTime()для измерений.

Затмение:

Я получил в то же время в обоих случаях - вокруг 1,564 секунды ,

Netbeans:

  • С помощью "#": 1,536 секунды
  • Использование «B»: 44,164 секунды

Таким образом, похоже, что Netbeans имеет плохую производительность при печати на консоли.

После дальнейших исследований я понял, что проблема линия Упаковочное максимального буфера Netbeans (это не ограничивается System.out.printlnкоманда), продемонстрированный этим кодом:

for (int i = 0; i < 1000; i++) {
    long t1 = System.nanoTime();
    System.out.print("BBB......BBB"); \\<-contain 1000 "B"
    long t2 = System.nanoTime();
    System.out.println(t2-t1);
    System.out.println("");
}

Результаты времени меньше 1 миллисекунды на каждой итерации, кроме каждая пятая итерация , когда результат составляет около 225 миллисекунд. Что-то вроде (в наносекундах):

BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
BBB...31744
BBB...31744
BBB...31744
BBB...31744
BBB...226365807
.
.
.

И так далее..

Резюме:

  1. Eclipse отлично работает с "B"
  2. У Netbeans есть проблема с переносом строк, которая может быть решена (потому что проблема не возникает в eclipse) (без добавления места после B («B»)).

142