Всем привет. Писать на java недавно начал. Так вот дело в том что есть задача на рекурсию условие можно пасареть по этой ссылке я вроде сделал ее, но проходит из 10 тестов 9 тестов. 1 тест пишет Превышено максимальное время работы вот код http://paste.ideaslabs.com/show/Q6lWOyFdXZ
Уважаемый Йода, Вам скорее всего стоит отказаться от множественного
x[i] + " "
.Почему?
Каждый раз при этом создается новый экземпляр String. И потом вас радует garbage collector.
Можно на более понятном языке, я же только начинающий...
Особенности Java. Каждый раз при выполнении
x[i] + " "
создается новая строка, сохранаяется в памяти и затем подается методу println. Эти строки постепенно накапливаются в памяти и тут в дело вступает garbage collector (сборщик мусора).На практике получается примерно так: выводится примерно 10^6 чисел, для каждого из них у вас создается новая строка и в итоге у вас 2 мегабайта занято. Через какое-то время, когда памяти станет не хватать, запустится сборщик мусора и удалит ненужные экземпляры, а на это затрачивается время.
И как быть?
Варианты:
Два вызова print() — один с числом, другой — с пробелом.
Переписать под один длинный StringBuilder. Т.е. по ходу выполнения программы вы не выводите всё сразу на консоль, а сначала складываете в StringBuilder. Этот StringBuilder имеет смысл создать с запасом по памяти изначально. В конце делаете ему ToString() и результат отправляете на консоль.
Кстати, пробовал заслать с двумя вызовами print — не заходит.
Маловероятно это причина, но судя по документации println делает за собой flush.Нет, сprint('\n')
то же самое. Странно. Разве у PrintWriter'а нету буферизации?А вот через StringBuffer заходит
По умолчанию включен автоматический сброс, который реализован вот так:
Какой тут GC, если программа жрёт меньше 1 мб. Да и создание объектов тут совсем в смешных масштабах. Но в целом проблема с излишним выделеним объектом вполне встречается (несмотря на то, что компилятор может заменить конкатенацию на работу с StringBuilder/StringBuffer). В данном случае педалей добавляет периодический сброс буфера System.out в консоль( или на диск). Если весь вывод хранить в StringBuilder и сбросить его весь целиком в конце, то получите ускорение раз в 8-10 на вашей задаче.