2016-02-11 6 views
-1

Добавляет присвоение переменной (с целью улучшения процесса отладки) в следующий тип метода замедляет выполнение более чем на одну секунду (1 тыс. Мс) на ~ 1k вызовов?Могу ли я улучшить отладку, назначив значение переменной перед возвратом без ущерба для производительности?

Я исправлю в своем предположении, что переменная выпадет из области видимости и будет собрана мусор, когда метод завершит выполнение?

Рефакторинг этот метод:

public String concatenateOneOrTwo(String input, boolean one){ 
    if(one){ 
     return concatenate(input, "one"); 
    }else{ 
     return concatenate(input, "two"); 
    } 
} 

Чтобы что-то вроде этого:

public String concatenateOneOrTwo(String input, boolean one){ 
    String returnValue = ""; 

    if(one){ 
     returnValue = concatenate(input, "one"); 
    }else{ 
     returnValue = concatenate(input, "two"); 
    } 

    return returnValue; 
} 

Этот второстепенный рефакторинг может улучшить процесс отладки; Это позволит разработчику легко проверить возвращаемое значение и повысить удобство обслуживания кода.


Дополнительных ресурсы

public String concatenate(String one, String two){ 
    return one + two; 
} 
+2

2-я версия является предпочтительной, для удобства чтения, и я сомневаюсь, что вы могли бы измерить разницу с любыми имеющимися у вас инструментами. – EdgeCase

+0

Какова проблема в оценке значения отладчика всего метода 'concatenateOneOrTwo'? – Andremoniy

+0

Просто компиляция двух версий с javac показывает, что они производят разные байткоды, а второй выглядит немного менее эффективным. Я был бы ошеломлен, если бы у него было какое-то заметное влияние на производительность. – resueman

ответ

2

Я думаю, что справедливо сказать, что любые затраты производительности, связанные с этим объявлением переменного и назначением было бы совершенно незначительными.

Когда вы вызываете метод concatenate, возвращаемое значение является ссылкой на фактические данные строки. Строковые данные хранятся в куче. Это происходит в любом из перечисленных вами сценариев.

Переменная returnValue - это просто ссылка на строку; это не копия строки, поэтому ее площадь памяти очень низкая. Кроме того, returnVariable хранится в стеке, поэтому его даже не нужно собирать мусор. Как только он выходит из сферы действия, он вылетает из стека.

В любом случае основная часть сложности (как по времени, так и по пространству) происходит в любом случае из-за конкатенации строк (и хранения строки в куче). Итак, нижняя строка, это, вероятно, не стоимость, о которой вы должны беспокоиться.

+0

Java хранит только примитивы в стеке. Строка не примитивна - она ​​создается на куче. Если быть точным, можно было бы предположить, что он фактически создан внутри метода 'concatenate'. – Grogi

+0

Правильно, что строки являются объектами, поэтому они хранятся в куче. Ссылка на объект, однако, хранится в стеке.Поэтому, если вызов метода concat создает строку '' onetwo'', '' onetwo '' хранится в куче. Однако 'returnValue' не является строкой. Это ссылка на строку. Эта ссылка хранится в стеке. [Это сообщение] (https://stackoverflow.com/questions/19623563/where-does-java-reference-variable-stored) более подробно обсуждает концепцию. – tyler