Я попытался оптимизировать заполнение квадратного двумерного массива Java суммами индексов для каждого элемента, вычисляя каждую сумму один раз для двух элементов, противоположных относительно основной диагонали. Но вместо ускорения или, по крайней мере, сопоставимой производительности, у меня есть код 23 (!) Раза медленнее.
Мой код:
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OperationsPerInvocation(ArrayFill.N * ArrayFill.N)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class ArrayFill {
public static final int N = 8189;
public int[][] g;
@Setup
public void setup() { g = new int[N][N]; }
@GenerateMicroBenchmark
public int simple(ArrayFill state) {
int[][] g = state.g;
for(int i = 0; i < g.length; i++) {
for(int j = 0; j < g[i].length; j++) {
g[i][j] = i + j;
}
}
return g[g.length - 1][g[g.length - 1].length - 1];
}
@GenerateMicroBenchmark
public int optimized(ArrayFill state) {
int[][] g = state.g;
for(int i = 0; i < g.length; i++) {
for(int j = 0; j <= i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
return g[g.length - 1][g[g.length - 1].length - 1];
}
}
Результаты тестов:
Benchmark Mode Mean Mean error Units
ArrayFill.simple avgt 0.907 0.008 ns/op
ArrayFill.optimized avgt 21.188 0.049 ns/op
Вопрос:
Как можно объяснить падение производительности настолько потрясающее?
<суб > Р. Версия S. Java - это 1.8.0-ea-b124, 64-разрядный процессор AMD с тактовой частотой 3,2 ГГц, тесты были выполнены в одном потоке.