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

2398

Я создал две матрицы из 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() для измерений
  • 55
    Попробуйте изменить rand.nextInt (4) == 0 на i <250, чтобы исключить эффект генератора случайных чисел. Вы можете исчерпать энтропию, которая замедляет случайное поколение
  • 3
    Кажется, что оба работают на моей машине одинаковое количество времени, ~ 4 секунды.
Показать ещё 8 комментариев
Теги:
performance
for-loop
loops
system.out

2 ответа

3642
Лучший ответ

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

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

  • 522
    Это на самом деле правильный ответ! Добавление пробела после того, как B решает это.
  • 241
    Есть некоторые ответы, которые приходят из усвоенного опыта. TJ и я (так как мы друзья) выросли во времена Apple] [и zx80 / 81. Тогда не было встроенного переноса слов. Таким образом, мы оба в конечном итоге написали свои собственные - не раз. И эти уроки остаются с вами, они сжигаются в вашем мозгу ящерицы. Но если вы склонялись к коду после этого, когда ваше окружающее слово упаковывает все, или вы делаете это вручную до выполнения, вам будет сложнее столкнуться с проблемами с переносом слов.
Показать ещё 13 комментариев
165

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

Eclipse:

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

Netbeans:

  • Использование "#": 1,536 секунды
  • Использование "B" : 44.164 секунд

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

После большего количества исследований я понял, что проблема заключается в = "noreferrer" > line-wrapping максимального буфера 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
.
.
.

И так далее..

Резюме:

  • Eclipse отлично работает с "B"
  • У Netbeans есть проблема с переносом строк, которая может быть решена (потому что проблема не возникает в eclipse) (без добавления места после B ( "B" )).
  • 26
    Можете ли вы уточнить свои исследовательские стратегии, а затем, что в конечном итоге привело вас к выводу, что виновником является перенос строк? (Мне интересно ваши детективные навыки, то есть!)

Ещё вопросы

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