Почему печать "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()
для измерений
Ответы
Ответ 1
Чистая спекуляция заключается в том, что вы используете терминал, который пытается сделать word-wrapping, а не обертывание символов, и обрабатывает B
как символ слова, но #
как символ неслов. Поэтому, когда он достигает конца строки и ищет место для разрыва линии, он видит #
почти сразу и счастливо ломается; тогда как с B
он должен продолжать поиск дольше и может иметь больше текста для обертывания (что может быть дорогостоящим на некоторых терминалах, например, выведение обратных пространств, а затем вывод пробелов для перезаписывания переворачиваемых букв).
Но эта чистая спекуляция.
Ответ 2
Я провел тесты на 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" )).
Ответ 3
Да, виновник определенно перенос слов. Когда я тестировал две ваши программы, среда IDE NetBeans 8.2 дала мне следующий результат.
- Первая матрица: O и # = 6,03 секунды
- Вторая матрица: O и B = 50,97 секунды
При внимательном рассмотрении вашего кода вы использовали разрыв строки в конце первого цикла. Но вы не использовали разрыв строки во втором цикле. Итак, вы собираетесь напечатать слово с 1000 символов во втором цикле. Это вызывает проблему переноса слов. Если мы используем несловесный символ "" после B, для компиляции программы потребуется всего 5,35 секунды. И если мы используем разрыв строки во втором цикле после прохождения 100 значений или 50 значений, это займет всего 8,56 секунды и 7,05 секунды соответственно.
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");
}
if(j%100==0){ //Adding a line break in second loop
System.out.println();
}
}
System.out.println("");
}
Еще один совет - изменить настройки среды IDE NetBeans. Прежде всего, перейдите в NetBeans Инструменты и нажмите Параметры. После этого нажмите Editor и перейдите на вкладку Форматирование. Затем выберите "В любом месте" в перенос строки. Компиляция программы займет почти на 6,24% меньше времени.