Любое решение, которое вы попробуете, должно быть проверено в контролируемых условиях, максимально приближенных к условиям производства. Из-за природы Java вам нужно немного потренироваться в коде, чтобы получить достоверную статистику производительности, но я уверен, что вы уже это знаете.
При этом можно попробовать несколько вещей, которые я использовал для успешной оптимизации моего Java-кода (, но не на Android JVM )
for(int y=0;y<10;y++){
for(int x=0;x<10;x++){
if(array[x][y]!=null)
//perform task here
}
}
в любом случае должен быть переработан в
for(int x=0;x<10;x++){
for(int y=0;y<10;y++){
if(array[x][y]!=null)
//perform task here
}
}
Часто вы получаете улучшение производительности от кэширования ссылки на строку. Пусть as предполагает, что массив имеет тип Foo[][]
:
for(int x=0;x<10;x++){
final Foo[] row = array[x];
for(int y=0;y<10;y++){
if(row[y]!=null)
//perform task here
}
}
Использование final
с переменными должно было помочь JVM оптимизировать код, но я думаю, что современные JIT-компиляторы JIT во многих случаях могут самостоятельно определить, изменилась ли переменная в коде или нет. С другой стороны, иногда это может быть более эффективным, хотя определенно ведет нас в область микрооптимизации:
Foo[] row;
for(int x=0;x<10;x++){
row = array[x];
for(int y=0;y<10;y++){
if(row[y]!=null)
//perform task here
}
}
Если вам не нужно знать индексы элемента для выполнения задачи над ним, вы можете написать это как
for(final Foo[] row: array){
for(final Foo elem: row
if(elem!=null)
//perform task here
}
}
Еще одна вещь, которую вы можете попробовать, - это сгладить массив и сохранить элементы в массиве Foo[]
, обеспечивая максимальную локальность ссылок. Вам не нужно беспокоиться о внутреннем цикле, но вам нужно выполнить некоторую индексную арифметику при обращении к конкретным элементам массива (в отличие от зацикливания по всему массиву). В зависимости от того, как часто вы это делаете, это может быть или не быть полезным.
Поскольку большинство элементов будут ненулевыми, сохранение их в качестве разреженного массива не выгодно для вас, поскольку вы теряете локальность ссылок.
Другая проблема - нулевой тест. Сам нулевой тест не стоит дорого, но условный оператор, следующий за ним, стоит, так как вы получаете ветку в коде и теряете время на неправильных предсказаниях ветвления. То, что вы можете сделать, это использовать «нулевой объект», над которым можно будет выполнить задачу, но это будет неоперативный или что-то в равной степени благоприятное. В зависимости от задачи, которую вы хотите выполнить, она может работать, а может и не работать.
Надеюсь, это поможет.