Wie wir früher mit arrays proggten…

Früher, als man seine softwäjhr noch so geschrieben hat, dass sie den rechner nicht in die knie zwang und so, dass sie nach möglichkeit einfach gut lief, hatten wir natürlich auch schon das problem, dass die größe eines array manchmal erst zur laufzeit feststand. Tja, dann haben wir halt mit malloc() eine ausreichend erscheinende menge speicher alloziert, uns gemerkt, wieviel das ist und wenn wir beim einfügen an die grenzen kamen, haben wir den speicherbereich mit realloc() vergrößert — in der regel durch schlichte verdopplung¹ der allokazjon. Und wenn man sortiert einfügen wollte, einfach mit binärer suche den ort zum einfügen des neuen elementes gefunden und mit memmove() platz für das neue element geschaffen, dass wir dann an die richtige stelle brachten. Nicht, dass so etwas spaß macht, aber es funkzjoniert und ist halbwegs performant.

Tja, das waren die alten zeiten, in denen man altmodische sprachen wie C verwendet hat, die einem nicht alles am kompjuter abstrahierten. Heute hingegen, heute ist alles viel viel besser. Heute fordert man einfach für jedes eingefügte element einen neuen speicherbereich an, der für ein element mehr platz bietet, kopiert den alten speicherbereich in den neuen und fügt das neue element an, um zum einfügen an die richtige stelle eine allgemeine biblioteks-sortierfunktion (meistens als mergesort oder quicksort implementiert) aufzurufen. Am besten in einer inneren for(;;)-schleife, also für eine vorab bekannte anzahl von fällen nacheinander. Und damit man nicht sofort merkt, wie hirnrissig das ist, notiert sich das ganze in schönster C++-syntax. So wird aus ganz gewöhnlicher datenverarbeitung eine implementazjon, die auch auf zeitgemäßer hardwäjhr ganz schön lahmarschig läuft. Und es gibt keine elektronen im kompjuter, die sich dabei langweilen.

Ich führe ja einen großteil der unbefriedigenden performanz „moderner“ anwendungen auf solche idjotie zurück…

¹Technischer hinweis: ursprüngliche allokazjon ist gern eine zweierpotenz minus eins, und zum vergrößern wird dieser wert verdoppelt und eins addiert, so dass wieder eine zweierpotenz minus eins rauskommt, also 255, 511, 1023, 2047, etc. Natürlich kann man das oft — je nach konkreter anwendung — ein bisschen intelligenter machen, aber frühzeitige optimierung ist eine der häufigsten und garstigsten fehlerkwellen, und diese schlichte implementazjon ist ganz brauchbar. Ziel des vorgehens ist es, die relativ aufwändige und langsame anforderung von speicher selten zu machen.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Google Foto

Du kommentierst mit Deinem Google-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.