Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / странное поведение LinkedList / 18 сообщений из 18, страница 1 из 1
22.11.2013, 20:05:32
    #38474918
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Здравствуйте. Решил наглядно проверить производительность 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
22.11.2013, 20:06:16
    #38474921
sharmanka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Собственно вопрос - почему так происходит? :)
...
Рейтинг: 0 / 0
22.11.2013, 20:13:38
    #38474926
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Ну так на вставку ArrayList делает только реаллокацию(если надо) и добавление в массив.
А LinkedList создает контейнер с линками и устанавливает связи.
В случае вставки же ArrayList вынужден перемещать кусок массива, что явно накладнее.
...
Рейтинг: 0 / 0
22.11.2013, 20:13:46
    #38474927
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
sharmanka1. По-идее вставка в конец линкедлиста должна быть всегда быстрее, ведь мы не тратим время на увеличиние размера внутреннего массива

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

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

Зависит от многих факторов. Копирование блока массива это тоже очень дешевая операция.
...
Рейтинг: 0 / 0
22.11.2013, 20:17:10
    #38474933
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Во втором случае кстати вы мотаете лист в середину - это самая сложная операция для LinkedList
...
Рейтинг: 0 / 0
22.11.2013, 20:18:33
    #38474936
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Вставка в LinkedList быстрее только из итератора, потому что итератору известен текущий узел и не надо перебирать с края списка.
...
Рейтинг: 0 / 0
22.11.2013, 20:22:47
    #38474938
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Да и то, в итератор вставлять то нельзя )
...
Рейтинг: 0 / 0
22.11.2013, 20:24:02
    #38474939
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
ЛагманДа и то, в итератор вставлять то нельзя )
Можно.
...
Рейтинг: 0 / 0
22.11.2013, 20:26:11
    #38474941
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Вставка в голову, или в какое-то другое фиксированое место списка, действительно немного быстрее у LinkedList.
Но это не даёт никакой выгоды от его использования, так как все другие операции с ним проигрывают в производительности намного сильнее.
...
Рейтинг: 0 / 0
22.11.2013, 22:19:39
    #38475008
Лагман
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
странное поведение LinkedList
Blazkowicz,


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

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

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

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

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

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

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

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

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


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