#java #коллекции #arraylist #linked_list
Решил сравнить быстродействие. Написал простой пример:
public class ServiceList {
public void addList(List list, String name){
Date start = new Date();
for (int i = 0; i < 4000000; i++) {
list.add(new String());
}
Date finish = new Date();
long time = finish.getTime() - start.getTime();
//sum = sum + time;
System.out.println("ADD "+ name + " : " + time);
}
}
public class Main {
public static void main(String[] args) {
for(int i = 0; i < 10; i++) {
new ServiceList().addList(new ArrayList(), "ArrayList");
new ServiceList().addList(new LinkedList(), "LinkedList");
System.out.println("- - - - - - - - -");
}
}
}
Результаты просто удивляют:
ADD ArrayList : 1218
ADD LinkedList : 2673
- - - - - - - - -
ADD ArrayList : 156
ADD LinkedList : 187
- - - - - - - - -
ADD ArrayList : 141
ADD LinkedList : 125
- - - - - - - - -
ADD ArrayList : 141
ADD LinkedList : 297
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 656
- - - - - - - - -
ADD ArrayList : 188
ADD LinkedList : 32
- - - - - - - - -
ADD ArrayList : 223
ADD LinkedList : 422
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 1001
- - - - - - - - -
ADD ArrayList : 312
ADD LinkedList : 391
- - - - - - - - -
ADD ArrayList : 31
ADD LinkedList : 1141
- - - - - - - - -
Почему они такие разные? А порой даже linked быстрее?
Ответы
Ответ 1
Нет смысла сравнивать эти структуры, если нет контекста их применения. Вставки только в конец? Удаления будут? Доступ нужен к каким элементам? У вас вставка всегда в конец. Там сложность O(1) для обеих реализаций. Вот только у ArrayList ресайз происходит, если он полностью забит. А стартовый размер, если память не изменяет, равен 10. То есть, уже после десятой вставки там будет ресайз. По поводу вставки. LinkedList выигрывает, когда вставки осуществляются в середину списка. Особенно, если вы переиспользуете итератор, тогда вставка/удаление может выполняться за O(1). Обращение к элементу в ArrayList всегда за O(1). В LinkedList в худшем случае O(n). Мне почему-то кажется, что вы там больше замеряете не работу с коллекциями, а время на создание строк. А если там в промежутках stop the world у GC будет, то вообще не релевантный тест тогда. У вас тесты без прогрева. По-хорошему, до тестов нужно прогреть jvm. Использовать Date для замеров времени - ужас. Используйте System.nanoTime() или хотя бы System.currentTimeMillis(). К чему это я? Ну да, вы получили какие-то метрики, но на них не сделать никаких выводов, пока не ясен контекст использования этих структур.
Комментариев нет:
Отправить комментарий