Информация

Дата основания
Местоположение
США
Сайт
www.intel.ru
Численность
5 001–10 000 человек
Дата регистрации

Блог на Хабре

Обновить
Комментарии 4

Нехватает цифр / тестов. А то пример с оптимизацией одного цикла в два и "в 3-4 раза быстрее" выглядит подозрительно.

int sum = 0;
for (int i = 0; i < size; i++) {
    sum += array[i];
}

В результате такой вот неопределённости, компилятору придётся сгенерировать код проверки на выход значения i за границы массива, который попадёт в исполняемый файл и будет выполняться при каждой операции доступа к массиву.

Но зачем? В данном случае достаточно одной проверки — сравнения значений size и размера массива. Если size <= array.length, проверка на выход за границу не нужна, если size > array.length, опять же без проверки можно пройти все элементы массива, потом кинуть исключение. Неужели компилятор андроида настолько примитивен?


Кстати, в данном случае можно написать так:


int sum = 0;
for (int i:array) {
    sum += i;
}

И этот вариант быстрее, если массив является полем объекта, а не переменной внутри метода. тут обоснование

Но зачем? В данном случае достаточно одной проверки — сравнения значений size и размера массива.

Проблема в том, что внутри цикла в общем случае не обязательно будет эта одна строчка.
Если код чуточку усложнить, то неопределённость возникнет, и нужно-таки использовать проверку.

int sum = 0;
for (int i = 0; i < size; i++) {
    if (i < array.length) {
        sum += array[i];
    }
}
size может измениться в теле цикла и в какой-то момент стать больше, чем array.length. Понятно, что в указанном примере всё нормально, и оно останется неизменным, но отследить этот момент может быть не так просто.
Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.