Из интереса: Недавно я столкнулся с ситуацией в одном из моих проектов Java, где я мог хранить некоторые данные либо в двумерном массиве, либо создавать для него выделенный класс, чей экземпляров я бы поместил в одномерный массив. Поэтому я задаюсь вопросом, существуют ли канонические советы по дизайну в этой области с точки зрения производительности (время выполнения, потребление памяти)?Производительность/потребление памяти Java: класс против массива
Без учета шаблонов проектирования (предельно упрощена ситуация), скажем, я мог бы хранить данные как
class MyContainer {
public double a;
public double b;
...
}
, а затем
MyContainer[] myArray = new MyContainer[10000];
for(int i = myArray.length; (--i) >= 0;) {
myArray[i] = new MyContainer();
}
...
против
double[][] myData = new double[10000][2];
...
я как-то думаю, что подход на основе массива должен быть более компактный (память) и быстрее (доступ). Опять же, возможно, это не так, массивы тоже являются объектами, а доступ к массиву должен проверять индексы, в то время как доступ к объектным членам не имеет. (?) Распределение массива объектов, вероятно, (?) Займет больше времени, так как мне нужно итеративно создать экземпляров, и мой код будет больше из-за дополнительного класса.
Таким образом, мне интересно, обеспечивают ли схемы общих JVM преимущества для одного подхода по сравнению с другим, с точки зрения скорости доступа и потребления памяти?
Большое спасибо.
Одно пояснение, массивы Java ** являются ** 'Object' (s). Даже массивы примитивов. –
@ElliotFrisch: Да, я это знаю (см. * ... массивы тоже объекты ... *). Тем не менее: возможно, JVM/JIT обрабатывает массивы особым образом, что может ускорить доступ к ним тем или иным способом. Также могут быть элементы кэширования/макета памяти и т. Д. Таким образом, я также спросил о * ... проектах общих JVM ... *. –
Возможно, вы можете использовать 'enum'. Они обрабатываются специально в том смысле, что они являются конструкциями времени компиляции. –