Я написал небольшую программу для вычисления первых 18 троек (x,y,z)
с x<y<z
, которые удовлетворяют x^3+y^3=z^3+1
.
Во время игры, чтобы оптимизировать общее время выполнения, я обнаружил, что с использованием double
для кубических значений и двух сторон уравнения быстрее, чем при использовании long
.На моей машине разница составляет около 3 секунд.
Теперь мне интересно, почему именно так.Я предполагаю, что это где-то во внутренней обработке long
при сравнении двух long
-переменных, так как это единственное, что изменяется внутри циклов вычисления.
Вот мой код:
class Threes {
public static void main(String[] args) {
System.out.println("Threes --- Java");
int Z_MAX = 60000, Y_MAX = Z_MAX-1, X_MAX = Y_MAX-1;
double[] powers = new double[Z_MAX+1];
for (int i = 0; i <= Z_MAX; i++) {
powers[i] = Math.pow(i, 3);
}
System.out.println("Powers calculated");
int x, y, z;
double right, left;
int[][] sets = new int[18][3];
int foundCount = 0;
long loopCount = 0;
long start, end;
start = System.currentTimeMillis();
for (x = 1 ; x < X_MAX; x++) {
for (y = x + 1; y < Y_MAX; y++) {
right = powers[x] + powers[y];
for (z = y + 1; z < Z_MAX; z++) {
left = powers[z] + 1;
if (right < left) {
z = Z_MAX;
} else if (right == left) {
sets[foundCount][0] = x;
sets[foundCount][1] = y;
sets[foundCount][2] = z;
foundCount++;
end = System.currentTimeMillis();
System.out.println("found " + foundCount + ". set:\t" + x + "\t" + y + "\t" + z + "\t" + ((end - start) / 1000.0));
if (foundCount == 18) {
x = X_MAX;
y = Y_MAX;
z = Z_MAX;
}
}
loopCount++;
}
}
}
System.out.println("finished: " + loopCount);
}
}
Я изменил следующие строки:
double[] powers = new double[Z_MAX+1];
становится
long[] powers = new long[Z_MAX+1];
и
powers[i] = Math.pow(i, 3);
становится
powers[i] = (long)Math.pow(i, 3);
и
double right, left;
становится
long right, left;
«Бонусный вопрос» : Какие еще возможности оптимизации всего кода с точки зрения общего времени выполненияДолжен ли я?Я знаю, что пропуск 1038 дает мне несколько миллисекунд.Я уверен, что мне нужно значительно сократить количество итераций цикла.Но как?