Kotlin самый эффективный способ установить последовательность - PullRequest
0 голосов
/ 14 марта 2019

Привет, у меня есть список из 1330 объектов, и я хотел бы применить метод и получить набор в качестве результата.

        val result = listOf1330
            .asSequence()
            .map {
                someMethod(it)
            }
        val resultSet = result.toSet()

Отлично работает без toSet, но если тогда время выполнения будет примерно в 10 раз больше. Я использовал последовательность, чтобы заставить ее работать быстрее, но в результате мне нужен список без дубликатов (установлено).

Просто: Какой самый эффективный способ преобразовать последовательность в набор?

Ответы [ 3 ]

4 голосов
/ 14 марта 2019
 val result = listOf1330.mapTo(HashSet()) { someMethod(it) }

Нет смысла использовать потоки или последовательности для реализации преобразования - вам понадобятся все элементы из коллекции, а не несколько.mapTomap) функции inline в Kotlin.Это означает, что код будет подставлен в сайт вызова, лямбда не будет создаваться и выполняться много раз.Мы используем mapTo, чтобы избежать второй копии коллекции, выполняемой функцией toSet().

.parallelStream() может повысить производительность, если вы хотите запустить вычисления в нескольких потоках.Это все еще хорошая идея, чтобы измерить, насколько хорошо распределена нагрузка между потоками.Производительность может зависеть от класса реализации коллекции, для которого вы его называете

1 голос
/ 14 марта 2019

Если ваша someObject имеет медленную реализацию equals() или hashCode() или дает один и тот же хэш-код для многих объектов, то это может объяснить задержку, и вы сможете ее улучшить.

В противном случае, если объекты большие, задержка может быть в основном связана с объемом памяти, который должен быть доступен для хранения их всех;если это так, это цена, которую вам придется заплатить, если вы хотите набор со всеми этими объектами в памяти.

Sequence.toSet() использует LinkedHashSet.Вы можете попробовать предоставить другой экземпляр Set, например, toCollection(HashSet()), чтобы проверить, не быстрее ли это.(Однако вы не получите тот же порядок итераций.)

0 голосов
/ 14 марта 2019

Я согласен с gidds ответом на HashSet и LinkedHashSet производительности.

LinkedHashSet дороже для вставок, чем HashSet;

Однако вПриведенный выше вариант использования, я думаю, мы можем использовать parallelStream для повышения производительности.Под капотом Kotlin использует Java parallelStream.

val result: Set<String> = listOf("sdgds", "fdgdfsg", "dsfgsdfg")
            .parallelStream()
            .map {
                someMethod(it)
            }.collect(Collectors.toSet())

Collectors.toSet() использует HashSet.Итак, с точки зрения производительности вставки все должно быть в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...