Странная вещь о исполнении ArrayList (Java)JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Странная вещь о исполнении ArrayList (Java)

Сообщение Anonymous »

I've had some concerns about java.util.ArrayList#add() method performance (it seems too slow to me), so I've downloaded Java source code and looked at the ArrayList implementation (which seems fine), I've copied clear() and add() methods and created my own ArrayList2:

Код: Выделить всё

public class ArrayList2
{
private static final int DEFAULT_CAPACITY = 10;

private static final Object[] EMPTY_ELEMENTDATA = {};
static int MAX_ARRAY_SIZE = 50000;

private transient Object[] elementData;

private int size;

public ArrayList2(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}

private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}

public boolean add(E e) {
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}

private void ensureCapacityInternal(int minCapacity) {
if (elementData == EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}

ensureExplicitCapacity(minCapacity);
}

private void ensureExplicitCapacity(int minCapacity) {

if (minCapacity - elementData.length > 0){
//System.out.println("WHAT");  //when this line is uncommented performance is improved
grow(minCapacity);
}
}

private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}

public void clear() {

for (int i = 0; i < size; i++)
elementData[i] = null;

size = 0;
}
}
Что, конечно, имеет такую ​​же производительность, как java.util.arraylist . Странная вещь происходит, когда строка 49 неуместна. Он содержит это: < /p>
System.out.println("What");
< /code>
После этого изменения метод добавления работает в 3-4 раза быстрее, что странно, потому что эта строка находится в блоке кода, который никогда не выполняется и, следовательно, не должен влиять на производительность. Я использовал простой тест, чтобы измерить время, проведенное в разных методах. Это выход: < /p>
**************************************
Filling Array List 2 took : 2107
Emptying Array List 2 took : 149
**************************************
**************************************
Filling Array List 3 took : 565
Emptying Array List 3 took : 182
**************************************
< /code>
Как это логически нерелевантное изменение может улучшить производительность так значительно? Может ли кто -нибудь объяснить это? Это действительно не имеет никакого смысла для меня, и в настоящее время мне кажется большой проблемой производительности в java.util.arraylist.

Подробнее здесь: https://stackoverflow.com/questions/194 ... mance-java
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»