Comments (1)
Hello,
retainAll calls Collection.contains(). The complexity of contains() is O(1) or O(logN) for sets and O(n) for list.
So, to be honest:
-
I was surprised that
(0..147853).toList().intersect((0..147853).toList())
takes only milliseconds -
I was not surprised that
(0..147853).toList().intersect((0..147853).toPersistentList())
takes minutes.
But the implementation of MutableCollection.retainAll(elements: Iterable) tries to be smart: in some cases, 'elements' is converted to a set and retainAll is applied using this set. It explains why the test case with two lists is so fast.
This behavior is handled by the following code from Iterables.kt
/** Returns true when it's safe to convert this collection to a set without changing contains method behavior. */
private fun <T> Collection<T>.safeToConvertToSet() = size > 2 && this is ArrayList
/** Converts this collection to a set, when it's worth so and it doesn't change contains method behavior. */
internal fun <T> Iterable<T>.convertToSetForSetOperationWith(source: Iterable<T>): Collection<T> =
when (this) {
is Set -> this
is Collection ->
when {
source is Collection && source.size < 2 -> this
else -> if (this.safeToConvertToSet()) toHashSet() else this
}
else -> toHashSet()
}
When 'this' is a persistent list, it is a collection but not an array list, so safeToConvertToSet() returns false and we don't do the conversion to hash set.
This is only an analysis, I don't have any solution for now.
from kotlinx.collections.immutable.
Related Issues (20)
- Non-empty immutable collections
- Ghost element when applying multiples minus operations on a PersistentHashSet
- Add support for linuxArm64 HOT 2
- java.util.ConcurrentModificationException in PersistentMap.mutate {} HOT 6
- Make all immutable interfaces `sealed` to prevent implementations that allow mutations HOT 11
- Dead Repo HOT 2
- PersistentList is missing a subList that returns a new PersistentList (currently returns ImmutableList) HOT 1
- Update kotlin version to 1.9.20 HOT 3
- Implementation methods inherited from `kotlin-stdlib` `Abstract[x]` are not visible in interfaces HOT 2
- PeristentHashMap.values creates a new instance of `PersistentHashMapValues` on each call HOT 3
- Consider `addAll` special cases HOT 1
- concurrentList.toPersistentList or concurrentMap.toPersistentMap is incorrectly implemented HOT 1
- Provide module-info descriptor for java 9 and later HOT 7
- WASM support HOT 3
- Add extension functions to convert Array to persistent collections
- Explicit API mode? HOT 5
- Introduce Binary compatibility validator to track API changes
- Add documentation for immutable adapters HOT 1
- Compiler warning: Exported declaration uses non-exportable parameter type HOT 4
- Is the Android fast iteratable methods supported? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from kotlinx.collections.immutable.