2015-01-31 8 views
1

Что лучше практика, чтобы следить за минимумом в списке:Обновление мин переменной: мин (а, б) против, если заявление

int minVal = a[0]; 
for (int i = 1; i < a.length; i++) { 
    minVal = Math.min(minVal, a[i]); 
} 

или

int minVal = a[0]; 
for (int i = 1; i < a.length; i++) { 
    if(a[i] < minVal) 
     minVal = a[i]; 
} 

В то время как первый код кажется легче читать, второй может быть более эффективным?

Что такое учебник?

+0

Если мы говорим о лучших практиках; [не используйте многострочные безделушки ifs] (http://cafe.elharo.com/blogroll/braceless-if-considered-harmful/) –

ответ

3

Это реализация Math.min:

public static int min(int a, int b) { 
    return (a <= b) ? a : b; 
} 

Условный оператор решает так же машинный код, что и оператор if-; присвоение локальной переменной практически бесплатное и в любом случае происходит на уровне машинного кода, потому что все промежуточные результаты должны быть сохранены где-то.

Если ваш цикл обнаружен как горячая точка во время выполнения вашей программы, компилятор JIT будет вставлять полный код Math.min в ваш цикл. В этот момент практически не будет разницы между двумя вариантами, которые вы рассматриваете.

Тем не менее, конечным судьей является измерение вашего кода работает. Если – и только если – вы видите фактическую проблему с производительностью, вы должны сначала использовать профилировщик, чтобы узнать, где именно потрачено время; никогда не доверяйте своим догадкам. Затем, если окажется, что этот конкретный цикл является узким местом, вы можете рассмотреть возможность тестирования с обоими параметрами, чтобы увидеть, имеет ли значение какое-либо значение.

1

Не делать premature optimizations. Если это не очень важный путь для программы, вы должны поощрять читаемость и ремонтопригодность кода над предполагаемым увеличением производительности.

Смежные вопросы