Являются ли типы значений L-world (из проекта valhalla) бесполезными на практике? - PullRequest
0 голосов
/ 23 февраля 2019

Я написал две версии программы, чтобы протестировать влияние на производительность размещения объектов в 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?

...