I'm trying to get into #rustlang. I've already rewritten a small program and it was an okay experience but today, I hit something weird.
I have a LinkedList and need to iterate over it and, if I found any item that meets some criteria, I need to remove it from the list.
Using C++ iterators, this would be O(N).
Rust's linked_list has an issue open for more than 4 years (!) to add a remove function to linked lists. But even with that function, you'll need an index of the item to be removed and cannot (as far as I can tell) use the iterator you already have from scanning the list.
So in Rust I would need to spend O(N) to scan the list and an additional O(N) for each item I need removed.
Or is there a faster way to do that?
#68705 adds a method in LinkedList to remove an element at a specified index. The feature gate for the issue is #![feature(linked_list_remove)].GitHub
In my experience, LinkedLists are great when the container is growing and shrinking dynamically or when you want to move stuff around within the collection while the rest of the items maintain their order. The downside is expensive random access to elements so list are better suited for use cases where you have to iterate through the collection anyways.
Vectors are better for access to random elements and if you know the size of the collection beforehand. It's also cheaper to insert elements at the end if the vector's current size can hold another element. Inserting elements anywhere other than the end or removing an element that is not at the front or back is ridiculously expensive.
i mean i kinda understand that, i just found it interesting the docs don't state this.
Though i kinda wanna do a benchmark of linked list inserting/removing elements in the middle vs vec = vec.iter().filter(remove_condition).collect() - how many elements do i need to filter out for a Vec to be faster? how much slower is iteration of linked lists?
theres a old benchmark by matklad which inserts random numbers into a sorted vec/list, which requires tons of insertions in the middle, that claims Vec is still far more performant at this.
Vev: 33365 μs
List: 184282 μs
https://github.com/matklad/vec-vs-list
but this was 8 years ago with a different linked list.
Compare vector vs linked list in terms of performance - matklad/vec-vs-listGitHub
Cooler Talk von @maximemelian. von der #mrmcd über Gaming unter Linux.
Was mich noch auf Windows hält, ist vor allem noch Windows Mixed Reality, was ich wohl für meine HP Reverb G2 brauche.
https://media.ccc.de/v/2024-396-die-zeit-fr-gaming-auf-linux-ist-jetzt-
In den letzten Jahren hat ein Handheld auf Linux Basis das Thema Gaming auf Linux auf den Kopf gestellt. Warum jetzt auch für dich Zeit g...media.ccc.de
Wer noch ein Windows Mixed Reality-Gerät benutzt, muss aufpassen: Das neue Windows-11-Update macht die VR-Brillen unbrauchbar.Tomislav Bezmalinovic (MIXED)
Die Shitshow der AfD heute in Thüringen, wegen der jetzt das Verfassungsgericht angerufen wird, kann man gut bei der taz im Liveticker nachlesen.
https://taz.de/-Live-Ticker-zum-Landtag-Thueringen-/!6039158/
Der neue Landtag startet mit mehrfachen langen Unterbrechungen. Schon die Frage über die Beschlussfähigkeit führt zu Streit. Draußen Protest gegen Rechtsruck.taz.de
Vielleicht sollte man mal darüber nachdenken, die Parteienfinanzierung ausschließlich auf Mitgliedsbeiträge zu reduzieren.
Ein Geldregen in Millionenhöhe für Sahra Wagenknecht sorgt für Aufsehen und viele Fragen. Die bisher unbekannte Herkunft der riesigen Spende hat t-online nun aufgedeckt – und sie führt überraschenderweise ins Showbusiness statt nach RusslandCarsten Janz (t-online)
Definitely not me doing code reviews
Warum redet die Regierung überhaupt mit der Opposition darüber? Wie zur Hölle sind wir zu einem Land geworden in dessen Parlament wirklich jede Fraktion auf "Ausländer Raus"-Kurs ist?
https://www.tagesschau.de/inland/innenpolitik/migrationsgipfel-ende-erster-gespraechsrunde-100.html
Die erste Gesprächsrunde von Ampel, Union und Ländern zum Thema Migration ist ohne konkretes Ergebnis beendet worden. Innenministerin Faeser zeigte sich dennoch optimistisch. Kommende Woche soll weiter beraten werden.tagesschau.de
Echt bitter.
Wenn einer so richtig krass rechte Politik machen kann, dann sind das Linke. Das hat man schon damals bei der Einführung von Hartz IV erlebt.
https://www.der-postillon.com/2024/09/asyldebatte.html
Berlin (dpo) - Das Thema Migration bestimmt seit Wochen den öffentlichen Diskurs in Deutschland, während die Bundesregierung mit immer schä...Der Postillon (Blogger)
Was für mich so richtig deprimierend an diesen "Ausländer-Raus"-Wochen ist, dass das von der progressivsten Regierung kommt, die wir auf absehbare Zeit haben werden. 🙁
rbb|24 ist das multimediale Nachrichtenportal für Berlin und Brandenburg. Nachrichten und Hintergrundberichte zu allen wichtigen Themen aus Politik, Wirtschaft, Kultur, Sport und Panorama.www.rbb24.de
Die S-Bahn-Anbindung des Hauptbahnhofs an die Ringbahn im Norden ist erneut verschoben worden. Laut Bahn soll der Start der neuen S15-Linie nun erst in im kommenden Jahr erfolgen. Die Begründung lautet: Die Zulassung sei "aufwändig und komplex".www.rbb24.de
Vor zwei Wochen ist mein Ventilator kaputt gegangen.
Ich so: Neue Ventilatoren sind gerade so teuer und der August und damit der Sommer sind ja auch schon fast vorbei. Das hältst du noch aus.
Der August:
Erinnert ihr euch noch, wie sie nach Kassel, Halle, Hanau und Idar-Oberstein allen deutschen Männern wegen der Anschläge die Sozialleistungen gekürzt haben?
Die Ampel-Koalition diskutiert nach dem tödlichen Anschlag von Solingen über ein Maßnahmenpaket. Die Pläne sollen unter anderem vorsehen: Wer im Rahmen eines Dublin-Verfahrens das Land verlassen muss, soll nur noch die nötigsten Sachleistungen bekomm…WELT
Gestern noch spät in der Nacht vom M'Era Luna nach Hause gefahren, dafür Perseiden gesehen.
(Datum und Uhrzeit meiner Dashcam stimmen nicht)
In der EU gibt es jetzt eine Initiative, die Hersteller von Video-Spielen, die immer eine Verbindung zu einem Server brauchen (bei mir z.B. Helldivers, No Mans Sky, Elite Dangerous), dazu verpflichten will, diese Spiele am End of Life in einem spielbaren Zustand zu hinterlassen.
Und ihr könnt das gerne mal mitzeichnen. :-)
https://citizens-initiative.europa.eu/initiatives/details/2024/000007_en
Politik in Berlin so: "Wohnungen sind knapp, warum zieht ihr nicht aufs Land?" 🤗
Politik auf dem Land:
#Crowdstrike ist das Hitzefrei der Erwachsenen. Also zumindest das der Büroarbeitenden.
In der Versicherung, in der meine Frau arbeitet, geht nichts mehr. Die werden ab 13:00 alle in den Überstundenabbau geschickt.
Wie die Deutsche Bahn die Dreistigkeit besitzt mir so einen unergonomischen Platz als vollwertigen Sitzplatz für eine mehrstündigen Zugfahrt im Fernverkehr zu verkaufen. 🤬
Bild CC-BY-SA Entbert
Technically that's also O(n) (O(2n) = O(n)).
I don't see much Rust code using `LinkedList`. Probably its more common to just use `Vec`. Which in many cases will end up performing better overall, regardless of language.
I've been writing Rust for 5 years and professionally for 2 years, I've seen a linked list outside of some very specific use cases.
Yes, Rust Linked List are very limited and you will most likely fight the borrow checker.
Are you sure you need a linked list? In most cases a Vec will be more efficient, and you won't have as many borrow checking issue.
If the order of elements doesn't matter, you can even use Vec::swap_remove for O(1) removal of elements.
if you want to remove all element that match a specific criteria, try using Vec::retain.
https://doc.rust-lang.org/stable/std/vec/struct.Vec.html#method.retain
https://doc.rust-lang.org/stable/std/vec/struct.Vec.html?search=retain#method.swap_remove
Vec in std::vec - Rust
doc.rust-lang.orgVec::retain
create a whole new copy of the collection, i.e. I'll need twice the memory at that point?I don't want to use Vec because:
LinkedList will likely use more memory. Each LinkedList element needs:
2 additional pointers,
Additional metadata for the allocation (size depends on the allocator)
Pushing an element to a vec is faster than to a LinkedList because it doesn't always need to allocate..
Removing from arbitrary locations can be done through swap_remove. But even remove is likely to be faster than linked list due to not needing to reallocate.
And most of the time they need specific properties from a specific linked list implementation, so they end up implementing their own, so the standard library version never got much attention, which is a bit disappointing for algorithms that actually need it..
I cannot use swap_remove because the ordering in the list matters. My use case: https://friends.mbober.de/display/b22eb8e8-4167-19df-204d-582842795229
As far as I know common C++ vector implementations, they do not release memory when removing an element from the vector unless many elements were removed since reducing the size of a vector means allocating new memory and copying all remaining elements which is quite expensive. I assume Rust's vec does the same. That is what I meant by "hogging" memory.
As I'm also exploring Rust for embedded applications. Performance and memory efficiency matters to me and I was told that Rust is as good as C++ in this regard.
it looks like an LRU cache. There are multiple crates already implementing this.
Looking at the most popular, it uses a custom unsafe linked list implementation to be able to hold multiple pointers to the same node, which would not be possible with a safe API as the standard library intends to do.
Vec does not deallocate when removing elements, but you can force that with shrink_to_fit.
You could also implement a linked list on top of a Vec, storing indices instead of pointers. It's probably more efficient with regards to cache and reducing the need for multiple allocations.
In embedded you want to limit allocations as much as you can. It often means preallocating all the memory you need at the very beginning of the program. Linked-list are not very friendly for that pattern.
Vec in std::vec - Rust
doc.rust-lang.orgstd::collections - Rust
doc.rust-lang.orgThat guide explicitly says I should use a LinkedList when:
Which is exactly why I want to use a linked list.
Vec
seems like it would do a lot of unnecessary memory allocation for that.BTW what I want to do is a cache that stores a key/value pair (both are strings). When an entry is hit, I want to move it to the front of the list.
When there is no hit, a network request is issued to fetch the value for the key. The key/value pair is then emplaced at the front of the list. If the list is then over the maximum capacity, the item at the back shall be removed.