Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Вставка в середину LinkedList медленнее чем ArrayList, почему? / 21 сообщений из 21, страница 1 из 1
18.09.2017, 14:50
    #39522766
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Пробую вставку данных в середину списка, чтобы увидеть что ArrayList медленнее LinkedList при вставке в середину списка, но почему то получаю обратную ситуацию

Код: plaintext
1.
ArrayList add:  339994441
LinkedList add: 6284958197

Я что то не так делаю/прочел/понял про работу этих листов?

Код: 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.
	public static void main(String... args) {

		ArrayList<Integer> arrayList = new ArrayList<Integer>();
		LinkedList<Integer> linkedList = new LinkedList<Integer>();

		// ArrayList add
		long startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			arrayList.add((int) i / 2, i);
		}
		long endTime = System.nanoTime();
		long duration = endTime - startTime;
		System.out.println("ArrayList add:  " + duration);

		// LinkedList add
		startTime = System.nanoTime();

		for (int i = 0; i < 100000; i++) {
			linkedList.add((int) i / 2, i);
		}
		endTime = System.nanoTime();
		duration = endTime - startTime;
		System.out.println("LinkedList add: " + duration);
	}
...
Рейтинг: 0 / 0
18.09.2017, 14:57
    #39522775
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgo,

Вы померяли не только вставку но и поиск по индексу.
...
Рейтинг: 0 / 0
18.09.2017, 15:06
    #39522778
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Blazkowicz,

Были у меня сомнения на этот счет, а как тогда может выглядеть вставка в середину листа без поиска?
...
Рейтинг: 0 / 0
18.09.2017, 15:11
    #39522784
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgoBlazkowicz,

Были у меня сомнения на этот счет, а как тогда может выглядеть вставка в середину листа без поиска?
Ну, либо через рефлексию с LinkedList, чтобы достучаться до объекта Node, который включает в себя ссылки на соседей, либо свой связный список написать. Какая супер задача-то? Померять очевидное?
...
Рейтинг: 0 / 0
18.09.2017, 15:13
    #39522789
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Blazkowicz,
Реальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим, а получается в реальной жизни этим воспользоваться то нельзя)

Спасибо за пояснения
...
Рейтинг: 0 / 0
18.09.2017, 15:18
    #39522792
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgoРеальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим,

Ну, с точки зрения структур данных, вам никто не мешает хранить ссылку на середину, тогда искать надобности не будет. Вы же не про Java Collection читаете?

DevIgoа получается в реальной жизни этим воспользоваться то нельзя)
Спасибо за пояснения
В реальной жизни есть ещё куча оптимизаций работы с массивами на всех возможных уровнях от GC и JIT до CPU, которые нивелируют даже теоретически возможное преимущество LinkedList.
...
Рейтинг: 0 / 0
18.09.2017, 15:25
    #39522798
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgoBlazkowicz,
Реальной задачи нет, просто из вычитанного это декларируется как преимущество одного над другим, а получается в реальной жизни этим воспользоваться то нельзя)

Спасибо за пояснения

Еще как можно. Допустим, у нас есть коллекция, нужно найти элемент с некоторым набором свойств и вставить объект после этого элемента. ArrayList и LinkedList дадут примерно одинаковое время поиска, но LinkedList выиграет на вставке.
...
Рейтинг: 0 / 0
18.09.2017, 15:33
    #39522810
Alexey Tomin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgoЯ что то не так делаю/прочел/понял про работу этих листов?

1. Вы меряете не линейкой, а прыгающим мячиком. Т.е. резульаты вообще ни о чём. Надо использовать
jmh - например вот
YouTube Video
...
Рейтинг: 0 / 0
18.09.2017, 15:53
    #39522820
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
BlazkowiczНу, с точки зрения структур данных, вам никто не мешает хранить ссылку на середину, тогда искать надобности не будет. Вы же не про Java Collection читаете?

Да
BlazkowiczВ реальной жизни есть ещё куча оптимизаций работы с массивами на всех возможных уровнях от GC и JIT до CPU, которые нивелируют даже теоретически возможное преимущество LinkedList.
Интересно замечание)
...
Рейтинг: 0 / 0
18.09.2017, 15:56
    #39522822
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Лысый дядькаЕще как можно. Допустим, у нас есть коллекция, нужно найти элемент с некоторым набором свойств и вставить объект после этого элемента. ArrayList и LinkedList дадут примерно одинаковое время поиска, но LinkedList выиграет на вставке.
Судя по моему тесту как раз таки в случае поиска и вставки ArrayList поиск и вставку делает быстрее, поэтому непонятно зачем именно при поиске и вставке будет использовать не ArrayList
...
Рейтинг: 0 / 0
18.09.2017, 15:56
    #39522824
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Спасибо, посмотрю
...
Рейтинг: 0 / 0
18.09.2017, 16:10
    #39522827
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgoСудя по моему тесту как раз таки в случае поиска и вставки ArrayList поиск и вставку делает быстрее,
Вы забыли уточнение, если поиск идет по порядковому номеру элемента.
Для задачи вставить элемент со значением 4 после каждого элемента, значение которого равно 3. Могут всплыть ньюансы.

Правда ArrayList.ensureCapacity может опять все поменять, но в любом случае переносов данных будет больше.
...
Рейтинг: 0 / 0
18.09.2017, 17:44
    #39522885
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Код: 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.
44.
45.
package com.company;

import java.util.*;
import java.util.function.Consumer;
import java.util.stream.IntStream;

public class Main {
    static List<Integer> arrayList = new ArrayList<>();
    static List<Integer> linkedList = new LinkedList<>();

    static Long arrayListTime = 0L;
    static Long linkedListTime = 0L;

    static void doIt(List<Integer> l, Consumer<Long> counterSaver){
        Long t1 = System.nanoTime();
        ListIterator<Integer> i = l.listIterator();
        while (i.hasNext()){
            Integer n = i.next();
            if(n == 500_000){
                IntStream.range(0, 1000).forEach(i::add);
                Long t2 = System.nanoTime();
                counterSaver.accept(t2 - t1);
                break;
            }
        }
    }

    static void fill(List<Integer> l){
        IntStream.range(0, 1_000_000).forEach(l::add);
    }



    public static void main(String[] args) {
        fill(arrayList);
        fill(linkedList);
        IntStream.range(0, 100).forEach((i)->
                {
                    doIt(arrayList, time -> arrayListTime += time);
                    doIt(linkedList, time -> linkedListTime += time);
                }
        );
        System.out.println("ArrayList = " + arrayListTime + " LinkedList = " + linkedListTime + " Total " + (arrayListTime - linkedListTime));
    }
}



На моей машине выгода очевидна
авторArrayList = 10695445356 LinkedList = 237158490 Total 10458286866
...
Рейтинг: 0 / 0
19.09.2017, 10:16
    #39523095
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
...
Рейтинг: 0 / 0
19.09.2017, 11:23
    #39523152
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
DevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

Alexey TominDevIgoЯ что то не так делаю/прочел/понял про работу этих листов?
1. Вы меряете не линейкой, а прыгающим мячиком. Т.е. резульаты вообще ни о чём. Надо использовать
jmh - например вот
YouTube Video
...
Рейтинг: 0 / 0
19.09.2017, 13:54
    #39523276
lleming
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
just_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
...
Рейтинг: 0 / 0
21.09.2017, 12:57
    #39524315
just_vladimir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
llemingjust_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
Точно! А когда писал комментарий не мог найти правильное упоминание, потому что это был Джошуа Блох, а не Даг Ли ...
...
Рейтинг: 0 / 0
21.09.2017, 14:23
    #39524367
DevIgo
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
llemingjust_vladimirDevIgo,
не помню где я услышал/прочитал про LinkedList, но вроде бы его автор Doug Lea как то признался, что ему ни разу не встретилось случая, когда потребовалось бы его использовать.

https://twitter.com/joshbloch/status/583813919019573248
Неожиданный поворот)
...
Рейтинг: 0 / 0
22.09.2017, 12:48
    #39524810
chabapok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
BlazkowiczНу, либо через рефлексию с LinkedList, чтобы достучаться до объекта Node, который включает в себя ссылки на соседей, либо свой связный список написать. Какая супер задача-то? Померять очевидное?

Что за привычка предлагать плохие варианты не предложив при этом штатного? Послушает вас топикстартер - и подумает, что других способов нет.

На самом деле, вставка в середину списка без поиска делается через итератор - ListIterator.add(), один раз его получаем - и через него делаем все вставки. В этом случае, время вставки - это будет только время вставки. Только в вашем случае итератор еще передвигать каждый раз придется. Работать, наверное, будет быстрей, чем ваш вариант, но не факт, что быстрей ArrayList.

Связанный список быстр на вставку-удаление только при условии что уже есть итератор, который указывает куда надо. Если итератора нет - его надо или получать поиском, или получать сдвигом другого итератора (что является, по сути формой линейного поиска, в котором время прямо пропорционально кол-ву шагов) - и вот эти операции съедают много, и в подавляющем большинстве случаев ArrayList оказывается не хуже.
...
Рейтинг: 0 / 0
22.09.2017, 13:32
    #39524849
Лысый дядька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
А никого не щекочет тестовый пример, который я выше дал?
...
Рейтинг: 0 / 0
22.09.2017, 16:11
    #39525004
Сергей Арсеньев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка в середину LinkedList медленнее чем ArrayList, почему?
Лысый дядька,

Так тут выбран оптимальный вариант для LinkedList и не оптимальный для ArrayList.

Если надо вставить N узлов в K точек. То для массива это делается не так. Один раз расширяем и потом сзади заполняем. Понятное дело N раз делать расширение с копированием всенго массива убъет все нафиг. А для связанного списка одлна пробежка и куча вставок самое милое дело.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Вставка в середину LinkedList медленнее чем ArrayList, почему? / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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