Почему печать " B "значительно медленнее, чем печать"#"?

я сгенерировал две матрицы 1000 x 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() измерения

2 ответов


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

но это чистая спекуляция.


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

затмение:

Я получил же время в обоих случаях вокруг 1.564 секунд.

Netbeans:

  • через "#": 1.536 секунд
  • Использование "B":44.164 секунд

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

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

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 ")).