Я написал две версии программы, чтобы протестировать влияние на производительность размещения объектов в java-программе.В одном используются простые объекты Java:
class Point {
public final double x;
public final double y;
public Point(double a, double b) {
x = a;
y = b;
}
public double len() {
return Math.sqrt(x*x + y*y);
}
public Point minus(Point o) {
return new Point(x-o.x, y-o.y);
}
}
// ...
public static void test () {
Point[] points = new Point[size];
for (int i=0; i<size; i++) {
points[i] = new Point(rnd.nextDouble(), rnd.nextDouble());
}
double sum = 0;
for (int i=0; i<size; i++) {
for (int j=i; j<size; j++) {
sum += points[i].minus(points[j]).len();
}
}
}
, а в другом - объекты Java разбиваются на локальные переменные:
class PointStatic {
static class PointBuffer {
double x;
double y;
}
static public double len(double x, double y) {
return Math.sqrt(x*x + y*y);
}
static public void minus(double x, double y, double o_x, double o_y, PointBuffer b) {
b.x = x - o_x;
b.y = y - o_y;
}
}
// ...
public static void test () {
double[] points_x = new double[size];
double[] points_y = new double[size];
for (int i=0; i<size; i++) {
points_x[i] = rnd.nextDouble();
points_y[i] = rnd.nextDouble();
}
double sum = 0;
PointStatic.PointBuffer b = new PointStatic.PointBuffer();
for (int i=0; i<size; i++) {
for (int j=i; j<size; j++) {
PointStatic.minus(points_x[i], points_y[i], points_x[j], points_y[j], b);
sum += PointStatic.len(b.x, b.y);
}
}
System.gc();
}
Оба теста выполняют одну и ту же (сложную для вычислений) задачу, единственное отличиеявляется то, что последний не выделяет никаких точечных объектов.Для тестирования этих реализаций я использовал следующий бегун:
static int size = 50000;
static int iters = 5;
public static void main (String[] args) throws InterruptedException {
for (int i=0; i<iters; i++) {
System.out.println(i);
Thread[] threads = new Thread[8];
for (int j=0; j<8; j++) {
threads[j] = new Thread(new Runnable() {
public void run() { test(); }
});
threads[j].start();
}
for (int j=0; j<8; j++) {
threads[j].join();
}
System.gc();
}
}
На моей машине первая версия заняла 2:36 минут, а вторая (оптимизированная) версия заняла 2:29 минут.Как видите, разница незначительна!Означает ли это, что компилятор jit делает типы значений, добавляемые в java 12, бесполезными?
Возможно, мой тестовый пример не является хорошей эмуляцией типов значений L-мира.В таком случае, каковы основные понятия, лежащие в основе L-мировых ценностей, типа проекта valhalla?