У меня есть следующая функция java, чтобы подсчитать общие элементы в двух отсортированных массивах. Обратите внимание на строку с вопросительным знаком.Код быстрее с ненужным условным?
public static int overlap(int[] a, int[] b)
{
int i = 0, j = 0;
int res = 0;
while(i < a.length && j < b.length)
{
if(a[i] > b[j])
j ++;
else if(a[i] < b[j])
i ++;
else if(a[i] == b[j]) // ?
{
res ++;
i ++;
j ++;
}
}
return res;
}
Очевидно, что этот последний оператор if не должен быть там: в этой точке мы знаем, что эти два значения равны. Однако, когда я проверяю скорость (я проверял, имеет ли порядок проверок какой-либо разницы), метод с избыточной проверкой неизменно быстрее, чем без (иногда в два раза).
Что здесь происходит? Какая-то таинственная оптимизация? Я не замечаю ничего очевидного? Я использую компилятор подставки, версия 1.8. Я не могу читать байт-код, поэтому я не знаю, что происходит под капотом.
Вот полный тестовый класс: https://gist.github.com/pbloem/1523283211454ec58ce9c5b45204eebd
Bytecode: https://gist.github.com/pbloem/ce4f6758f0bb1424c155c26e83ca88a1
Я думаю, было бы полезно, если бы вы отметили язык. Для меня это похоже на Java. –
@HorseFace Must've удалил тег случайно. Благодарю. – Peter
_Possibly_ related: [Branch Prediction] (http://stackoverflow.com/questions/11227809/why-is-it-faster-to-process-a-sorted-array-than-an-unsorted-array) – noahnu