Я сгенерировал две матрицы 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()
для измерений
java
performance
loops
for-loop
system.out
Куба Спатны
источник
источник
Ответы:
Чистое предположение заключается в том, что вы используете терминал, который пытается выполнять перенос слов, а не перенос символов, и обрабатывает его
B
как символ слова, а не#
как символ слова. Поэтому, когда он достигает конца строки и ищет место для разрыва линии, он видит#
почти сразу и счастливо разрывает там; в то время как с помощьюB
, он должен продолжать поиск дольше, и может иметь больше текста для переноса (что может быть дорого на некоторых терминалах, например, вывод пробелов, затем вывод пробелов для перезаписи переносимых букв).Но это чистое предположение.
источник
B
решает его.System.out.println
не выполняет перенос слов; то, что он выводил, - это перенос слов (и блокировка, поэтомуSystem.out.println
пришлось подождать).Я провел тесты на Eclipse vs Netbeans 8.0.2, оба с Java версии 1.8; Я использовал
System.nanoTime()
для измерений.Затмение:
Я получил одинаковое время в обоих случаях - около 1,564 секунды .
Netbeans:
Таким образом, похоже, что Netbeans имеет плохую производительность при печати на консоль.
После дополнительных исследований я понял, что проблема заключается в переносе строки в максимальном буфере Netbeans (он не ограничен
System.out.println
командой), демонстрируемый этим кодом:Временные результаты составляют менее 1 миллисекунды на каждую итерацию, кроме каждой пятой итерации , когда временной результат составляет около 225 миллисекунд. Что-то вроде (в наносекундах):
И так далее..
Резюме:
источник
Да, виновник определенно перенос слов. Когда я тестировал две ваши программы, среда IDE NetBeans 8.2 дала мне следующий результат.
При внимательном рассмотрении вашего кода вы использовали разрыв строки в конце первого цикла. Но вы не использовали разрыв строки во втором цикле. Итак, вы собираетесь напечатать слово с 1000 символов во втором цикле. Это вызывает проблему переноса слов. Если мы используем несловесный символ "" после B, компиляция программы займет всего 5,35 секунды . И если мы используем разрыв строки во втором цикле после прохождения 100 значений или 50 значений, это займет всего 8,56 секунды и 7,05 секунды соответственно.
Еще один совет - менять настройки среды IDE NetBeans. Прежде всего, перейдите в Инструменты NetBeans и нажмите Параметры . После этого нажмите « Редактор» и перейдите на вкладку « Форматирование ». Затем выберите Anywhere в Line Wrap Option. Компиляция программы займет почти на 6,24% меньше времени.
источник