-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Что делать с жунами

Четверг, 22 Апреля 2021 г. 01:21 + в цитатник
korvin:
Цитата sergioK @
Я таких ArrayList не один десяток написал , разных имплементаций ,

Зачем? Руки чесались? )

Цитата sergioK @
ArrayList умножает память на 3/2 и перегрузить это нельзя в отличии от вектора,

А LinkedList умножает память на 3.


Цитата sergioK @
и это одна имлементация интерфэйса java.util.List другая это Linked List,
пользуешь когда не знаешь сколько элементов будет.

Вот тебе бенчмарк на добавление «не знаешь сколько элементов»:

Скрытый текст

    import org.openjdk.jmh.annotations.*;
    import org.openjdk.jmh.infra.Blackhole;
    import ru.sources.collections.Collections;
    import java.util.Collection;
    import java.util.concurrent.TimeUnit;
    import java.util.function.IntFunction;
    @BenchmarkMode(Mode.AverageTime)
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    @Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    @OutputTimeUnit(TimeUnit.MICROSECONDS)
    @Fork(
    value = 3,
    jvm = "/Library/Java/JavaVirtualMachines/adoptopenjdk-15.jdk/Contents/Home/bin/java",
    jvmArgsAppend = {
    "-server",
    "-disablesystemassertions",
    //"-XX:+UseSerialGC",
    //"-XX:+UseParallelGC",
    //"-XX:+UseZGC",
    "-XX:+UseShenandoahGC",
    "-Xms8g",
    "-Xmx8g"
    })
    @State(Scope.Thread)
    public class CollectionsBenchmark {
    private static final String LINKED_LIST = "LinkedList";
    private static final String ARRAY_LIST = "ArrayList";
    //@Param({"10", "100"})
    //@Param({"100", "10000", "1000000"})
    @Param({"1000", "100000", "10000000"})
    private int itemsToAdd;
    @Param({LINKED_LIST, ARRAY_LIST})
    private String type;
    private IntFunction> subject;
    @Setup
    public void setup() {
    switch (type) {
    case LINKED_LIST -> subject = Collections::linkedList;
    case ARRAY_LIST -> subject = Collections::arrayList;
    }
    }
    @Benchmark
    public void addMany(Blackhole blackhole) {
    blackhole.consume(subject.apply(itemsToAdd));
    }
    }



subjects

    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.LinkedList;
    public final class Collections {
    public static Collection arrayList(int items) {
    final var c = new ArrayList<>();
    for (int i = 0; i < items; i++) {
    c.add(i);
    }
    return c;
    }
    }



Вот результаты с разными GC (меньше — лучше):

Serial:
    Benchmark (itemsToAdd) (type) Mode Cnt Score Error Units
    CollectionsBenchmark.addMany 1000 LinkedList avgt 15 5.210 ± 0.053 us/op
    CollectionsBenchmark.addMany 1000 ArrayList avgt 15 3.530 ± 0.028 us/op
    CollectionsBenchmark.addMany 100000 LinkedList avgt 15 487.786 ± 7.153 us/op
    CollectionsBenchmark.addMany 100000 ArrayList avgt 15 361.776 ± 3.407 us/op
    CollectionsBenchmark.addMany 10000000 LinkedList avgt 15 114308.717 ± 24496.008 us/op
    CollectionsBenchmark.addMany 10000000 ArrayList avgt 15 74059.694 ± 1124.293 us/op


Parallel:
    Benchmark (itemsToAdd) (type) Mode Cnt Score Error Units
    CollectionsBenchmark.addMany 1000 LinkedList avgt 15 5.191 ± 0.038 us/op
    CollectionsBenchmark.addMany 1000 ArrayList avgt 15 3.524 ± 0.042 us/op
    CollectionsBenchmark.addMany 100000 LinkedList avgt 15 490.742 ± 7.725 us/op
    CollectionsBenchmark.addMany 100000 ArrayList avgt 15 364.297 ± 7.221 us/op
    CollectionsBenchmark.addMany 10000000 LinkedList avgt 15 145307.026 ± 35319.645 us/op
    CollectionsBenchmark.addMany 10000000 ArrayList avgt 15 71625.532 ± 3860.046 us/op


ZGC:
    Benchmark (itemsToAdd) (type) Mode Cnt Score Error Units
    CollectionsBenchmark.addMany 1000 LinkedList avgt 15 5.714 ± 0.548 us/op
    CollectionsBenchmark.addMany 1000 ArrayList avgt 15 5.573 ± 0.298 us/op
    CollectionsBenchmark.addMany 100000 LinkedList avgt 15 553.497 ± 38.279 us/op
    CollectionsBenchmark.addMany 100000 ArrayList avgt 15 583.829 ± 33.537 us/op
    CollectionsBenchmark.addMany 10000000 LinkedList avgt 15 136561.101 ± 62714.469 us/op
    CollectionsBenchmark.addMany 10000000 ArrayList avgt 15 147221.840 ± 65372.420 us/op


Senandoah:
    Benchmark (itemsToAdd) (type) Mode Cnt Score Error Units
    CollectionsBenchmark.addMany 1000 LinkedList avgt 15 4.516 ± 0.100 us/op
    CollectionsBenchmark.addMany 1000 ArrayList avgt 15 3.904 ± 0.123 us/op
    CollectionsBenchmark.addMany 100000 LinkedList avgt 15 453.895 ± 6.612 us/op
    CollectionsBenchmark.addMany 100000 ArrayList avgt 15 359.160 ± 7.098 us/op
    CollectionsBenchmark.addMany 10000000 LinkedList avgt 15 59037.699 ± 9332.316 us/op
    CollectionsBenchmark.addMany 10000000 ArrayList avgt 15 56993.428 ± 3011.366 us/op


Ну и где тут преимущества LinkedList на добавление неизвестного заранее количества элементов?
С первыми двумя GC LinkedList заметно сливает, со вторыми ± одинаково получается.

Добавлено
Цитата applegame @
Кортеж это пример иммутабельной структуры требующей полного копирования для изменения. Кейсы тут вообще не в тему, ты же ни о каких кейсах не упоминал, когда заявил:

А по-твоему, списки они сферические в вакууме?

Цитата applegame @
Память у тебя как у рыбки:

Наоборот же, у тебя, не говоря уж, о твоих проблемах с чтением:
Цитата
Насчёт двусвязных списков не скажу, но как минимум их, например, нельзя просто сделать иммутабельными и/или ленивыми, в отличие от односвязных.

на второй странице.

Цитата applegame @
Ты таки согласен, что иммутабельный двусвязный список может быть реализован, с полным копированием при добавлении/изменении? Ответь прямо без юления.

С полным копированием можно что угодно сделать иммутабельным, только это не «просто». Тебе же не нужно показывать, как делается иммутабельный односвязный список?

Цитата applegame @
Вот сам придумываешь какие-то странные термины, что такое "ленивая функция"? Чем она отличается от "неленивой"?

Э-э… :facepalm: у тебя раздвоение личности? Я тебя спросил, какая операция там ленивая, ты ответил «print». print — это функция, т.е. ты же и назвал её ленивой

Цитата applegame @
Ну давай вернемся. Я с самого начала пытаюсь выяснить почему LinkedList, по словам жаба-селебрити, "совсем другое дело". Но пока от тебя так и не услышал ответа. Ты говооришь о чем угодно, кроме сути. Может таки ответишь вместо переливания в из пустого в порожнее?

Я тебе уже давно ответил, даже три пункта перечислил, с которыми ты же согласился, написав, что «Возможно, что LinkedList - просто корявая реализация двусвязного списка, тут спорить не буду ибо не знаю. Мои двусвязные списки (не на жабе, конечно) используют пулы, и добавляют по два указателя к каждой ноде.» (3-я страница). :facepalm: проверь память, я серьёзно.

Причём, вот ещё, например, кейс, вроде бы подходящий для двусвязного списка: LRU-кэш, но там нужно иметь ссылки на ноды, чтобы эффективно переставлять их в начало списка, но LinkedList не предоставляет возможности иметь ссылку на ноду, т.е. для этого кейса не подходит.

Цитата applegame @
Ты явно путаешь принципиальную возможность создать такой список и возможность создать его средствами самого иммутабельного ФП-языка.

Я нигде не писал про «принципиальную невозможность».

Цитата applegame @
Какое принципиальное отличие от односвязных списков в Scheme

двусвязность и закрытость для тебя не достаточно принципиальные отличия? Не знаю тогда. Может для тебя вообще все динамические структуры «на одно лицо»?

Цитата applegame @
сферических в вакууме списков в C?

Такая же сферическая в вакууме. Мне как-то не интересно гадать.

Цитата applegame @
Односвязный список и в Африке односвязный, какая разница это C или Scheme?

Во-первых, односвязный список можно реализовать по-разному:
– интрузивный или не интрузивный
– закрытый (объект-контейнер с внутренним приватным списком нод и предоставляющий доступ к элементов только описанными методами, инкапсулирующий манипуляции над нодами) или открытый (просто создаются сразу сами объекты нод)

Цитата applegame @
"не поймите неправильно, мне нравятся связные списки, они могут быть полезны, но вот LinkedList сделан через жопу, поэтому не используйте его"

Он именно так и написал, но ты предпочёл поСПГСить.

Цитата applegame @
Даю подсказку: ноды еще можно не по одной аллоцировать, а сразу непрерывными блоками по несколько штук, причем можно сразу и место для данных аллоцировать внутри ноды (интрузивные списки, о которых я писал ранее, а после и ты)

Вопрос: если ты не манипулируешь нодами, переставляя их, то нафига тебе связный список? Используй массив. А если манипулируешь, то вся эта изначальная локальность пойдёт лесом на хоть сколько-нибудь большом списке.

Цитата applegame @
А в чем проблема? Не нравится мой термин, предложи свой. Тем более если ты понял, то зачем цепляться? Лишь бы что-нибудь возразить?

Зачем я буду придумывать какой-то свой, если такие языки называют императивными?

https://forum.sources.ru/index.php?showtopic=421266&view=findpost&p=3846634

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку