powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / странное поведение LinkedList
18 сообщений из 18, страница 1 из 1
странное поведение LinkedList
    #38474918
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте. Решил наглядно проверить производительность LinkedList и ArrayList и столкнулся с странным поведением.
1. По-идее вставка в конец линкедлиста должна быть всегда быстрее, ведь мы не тратим время на увеличиние размера внутреннего массива
2. По тем же самым соображениям вставка в любое другое место линкед листа так же должна быть быстрее

Время в наносекундах, вставка 100000 элементов.

Add to end:
AL: 8723989
LL: 10759764
Insert:
AL: 2397568565
LL: 7617189267
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
        long start, end, result;
        int n = 100000;
        String element = "Hello";

        System.out.println("Add to end:");

        start = System.nanoTime();
        List list1 = new ArrayList();
        for (int i = 0; i < n; i++) {
            list1.add(element);
        }
        end = System.nanoTime();
        result = end - start;
        System.out.println("AL: " + result);

        start = System.nanoTime();
        List list2 = new LinkedList();
        for (int i = 0; i < n; i++) {
            list2.add(element);
        }
        end = System.nanoTime();
        result = end - start;
        System.out.println("LL: " + result);


        System.out.println("Insert:");

        start = System.nanoTime();
        for (int i = 0; i < n; i++) {
            list1.add(n / 2, element);
        }
        end = System.nanoTime();
        result = end - start;
        System.out.println("AL: " + result);

        start = System.nanoTime();
        
        for (int i = 0; i < n; i++) {
            list2.add(n / 2, element);
        }
        end = System.nanoTime();
        result = end - start;
        System.out.println("LL: " + result);
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474921
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно вопрос - почему так происходит? :)
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474926
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну так на вставку ArrayList делает только реаллокацию(если надо) и добавление в массив.
А LinkedList создает контейнер с линками и устанавливает связи.
В случае вставки же ArrayList вынужден перемещать кусок массива, что явно накладнее.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474927
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmanka1. По-идее вставка в конец линкедлиста должна быть всегда быстрее, ведь мы не тратим время на увеличиние размера внутреннего массива

Добавление в конец ArrayList далеко не всегда увеличивает размер массива. Соответсвенно и работает быстрее чем LinkedList.

sharmanka2. По тем же самым соображениям вставка в любое другое место линкед листа так же должна быть быстрее

Зависит от многих факторов. Копирование блока массива это тоже очень дешевая операция.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474933
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Во втором случае кстати вы мотаете лист в середину - это самая сложная операция для LinkedList
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474936
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставка в LinkedList быстрее только из итератора, потому что итератору известен текущий узел и не надо перебирать с края списка.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474938
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и то, в итератор вставлять то нельзя )
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474939
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманДа и то, в итератор вставлять то нельзя )
Можно.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38474941
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вставка в голову, или в какое-то другое фиксированое место списка, действительно немного быстрее у LinkedList.
Но это не даёт никакой выгоды от его использования, так как все другие операции с ним проигрывают в производительности намного сильнее.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475008
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,


BlazkowiczЛагманДа и то, в итератор вставлять то нельзя )
Можно.

Как?
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475009
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Переписал вставку листитератором. Результаты вставки в середину впечатляющее

Add to end:
AL: 7865178
LL: 9565968
Insert:
AL: 2335386077
LL: 7783895
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475010
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже все-такие не так с линкедлистом все плохо и прочитанное где-то утверждение, что в 99% он бесполезен, неверное. Всем спасибо за обсуждение :)
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475011
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЛагманКак?
Тока на прошлой неделе ведь обсуждали
http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.html#add(E)
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475015
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaПохоже все-такие не так с линкедлистом все плохо и прочитанное где-то утверждение, что в 99% он бесполезен, неверное. Всем спасибо за обсуждение :)
Ну, когда у вас будет жизненый пример полезного использования, тогда можно и обсудить. А так, написать синтетические тесты под заведомо выгодный только с одной стороны сценарий, много ума не надо.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475021
Лагман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

BlazkowiczЛагманКак?
Тока на прошлой неделе ведь обсуждали
http://docs.oracle.com/javase/6/docs/api/java/util/ListIterator.html#add(E)
лол, а слона то я и не приметил
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475022
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, кто-то вообще вопрос прочитал?

Например, в какой-то момент включается инкрементальный JIT-компилятор. И у вас время исполнения - включает компиляцию.

Много раз в статьях писали, что в жабе вот так напрямую нельзя мерять. Есть jmh, можно пытаться мерять им, но там тоже все далеко неоднозначно.

Еще мне кажется, что добавление в ArrayList с его расширением может в итоге происходить через "realloc" если это возможно, а realloc может быть и не копирующим, если это получается...

Кроме того, add добавляет в конец массива, а для ArrayList тяжелой операцией является добавление в начало.
И для добавления в LinkedList по индексу нужно найти ноду с этим индексом, а тяжесть этой операции пропорциональна индексу. Поэтому вставка в середину по индексу - доророгая в среднем операция, гораздо дороже чем у ArrayList. Когда говорят про дешевую вставку всередину, то подразумевают вставку по итератору а не по индексу.
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475027
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaПереписал вставку листитератором. Результаты вставки в середину впечатляющее

Ты еще попробуй с удалением из середины. например пробег итератором и вставку в начало. :)
...
Рейтинг: 0 / 0
странное поведение LinkedList
    #38475029
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много полезной инфы по ссылке
http://stackoverflow.com/questions/322715/when-to-use-linkedlist-over-arraylist
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / странное поведение LinkedList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]