Оболочки примитивных типов в массивах va-массив - PullRequest
4 голосов
/ 29 декабря 2010

В "Core java 1" я прочитал

ВНИМАНИЕ: ArrayList далеко менее эффективен, чем массив int [] потому что каждое значение отдельно завернутый в объект. Ты бы только хочу использовать эту конструкцию для небольшие коллекции, когда программист удобство важнее, чем эффективность.

Но в моем программном обеспечении я уже использовал Arraylist вместо обычных массивов из-за некоторых требований, хотя «Программное обеспечение должно иметь высокую производительность, и после того, как я прочитал цитируемый текст, я начал паниковать!» одну вещь, которую я могу изменить, - это изменить двойные переменные на Double, чтобы предотвратить автоматический бокс, и я не знаю, стоит ли это того или нет, в следующем примере алгоритма

public void multiply(final double val)
    {
        final int rows = getSize1();
        final int cols = getSize2();
        for (int i = 0; i < rows; i++)
        {
            for (int j = 0; j < cols; j++)
            {
                this.get(i).set(j, this.get(i).get(j) * val);
            }
        }
    }

Мой вопрос: меняет ли двойное на двойное? или это микрооптимизация, которая ни на что не повлияет? имейте в виду, что я мог бы использовать большие матрицы. 2-ой ли я должен пересмотреть всю программу снова?

Ответы [ 4 ]

4 голосов
/ 29 декабря 2010

Большая проблема с double против Double заключается в том, что последний добавляет некоторый объем памяти - 8 байт на объект на 32-битной виртуальной машине Sun, возможно, в большей или меньшей степени на других. Затем вам нужно еще 4 байта (8 в 64-битной JVM) для ссылки на объект.

Итак, при условии, что у вас есть 1 000 000 объектов, различия заключаются в следующем:

double[1000000]

8 байт на запись; всего = 8 000 000 байт

Double[1000000]

16 байт на экземпляр объекта + 4 байта на ссылку; всего = 20 000 000 байт

Вопрос, имеет ли это значение, очень сильно зависит от вашего приложения. Если вам не хватает памяти, предположите, что это не имеет значения.

1 голос
/ 29 декабря 2010

Double значительно дороже, чем double, однако в 90% случаев это не имеет значения.

Если вам нужен эффективный класс матрицы, я бы посоветовал вам использовать одну из библиотек, которая уже делает этоэффективно.например, Джама.

1 голос
/ 29 декабря 2010

Меняет место, где происходит автобокс, но больше ничего.

И второе - нет, не беспокойся об этом.Вряд ли это будет узким местом.Вы можете сделать некоторые тесты, чтобы измерить их по размеру ваших данных, чтобы доказать, что разница незначительна в отношении производительности вашего приложения.

0 голосов
/ 30 декабря 2010

Изменение аргумента double на Double не сильно поможет, оно немного ухудшит производительность, потому что его нужно распаковать для умножения.

Что поможет предотвратить множественные вызовы на get() как в:

    for (int i = 0; i < rows; i++)
    {
        List row = this.get(i);

        for (int j = 0; j < cols; j++)
        {
            row.set(j, row.get(j) * val);
        }
    }

(кстати, я угадал тип для строки.)

Предполагая, что вы используете список списков, использование итераторов вместо получения и установки с помощью индексов цикла приведет квыиграть еще немного производительности.

...