Library: rearrange storage layout

In-depth analysis of storage management revealed a misconception
with respect to possible storage optimisations, requiring more
metadata fields to handle all corner cases correctly.

It seems prudent to avoid any but the most obvious optimisations
and wait for real-world usage for a better understanding of the
prevalent access patterns. However, in preparation for any future
optimisations, all access coordination and storage metadata is
now relocated into the `ArrayBucket`, and thus resides within the
managed allocation, allowing for localised layout optimisations.

To place this into context: the expected prevalent use case is
for the »Render Nodes Network«, which relies on `AllocationCluster`
for storage management; most nodes will have only a single predecessor
or successor, leading to a large number of lib::Several intsances
populated with a single data element. In such a scenario, it is
indeed rather wasteful to allocate four »slot« of metadata for
each container instance; even more so since most of this
metadata is not even required in such a scenario.
This commit is contained in:
Fischlurch 2024-06-07 22:23:06 +02:00
parent 154a7018be
commit 130a021020
3 changed files with 132 additions and 15 deletions

View file

@ -334,17 +334,16 @@ namespace lib {
void
adjustSpread (size_t newSpread)
{
REQUIRE (Coll::size_);
REQUIRE (Coll::data_);
REQUIRE (newSpread * Coll::size_ <= storageSiz_);
size_t oldSpread = Coll::data_->spread;
if (newSpread > oldSpread)
// need to spread out
for (size_t i=Coll::size_-1; 0<i; --i)
for (size_t i=Coll::size()-1; 0<i; --i)
shiftStorage (i, oldSpread, newSpread);
else
// attempt to condense spread
for (size_t i=1; i<Coll::size_; ++i)
for (size_t i=1; i<Coll::size(); ++i)
shiftStorage (i, oldSpread, newSpread);
// data elements now spaced by new spread
Coll::data_->spread = newSpread;
@ -370,7 +369,7 @@ namespace lib {
{
using Val = typename IT::value_type;
size_t elmSiz = sizeof(Val);
adjustStorage (Coll::size_+1, requiredSpread(elmSiz));
adjustStorage (Coll::size()+1, requiredSpread(elmSiz));
UNIMPLEMENTED ("emplace data");
}

View file

@ -78,14 +78,18 @@ namespace lib {
struct ArrayBucket
{
ArrayBucket (size_t elmSize = sizeof(I))
: deleter{nullptr}
: cnt{0}
, spread{elmSize}
, buffSiz{0}//////////////////////////////////////////////////////////////OOO sollte man das nicht besser zwingend korrekt setzen?
, deleter{nullptr}
{ }
typedef void (*Deleter) (ArrayBucket*, size_t);
typedef void (*Deleter) (ArrayBucket*);
Deleter deleter;
size_t cnt;
size_t spread;
size_t buffSiz;
Deleter deleter;
/** mark start of the storage area */
alignas(I)
@ -139,13 +143,13 @@ namespace lib {
size_t
size() const
{
return size_;
return data_? data_->cnt : 0;
}
bool
empty() const
{
return not (size_ and data_);
return not data_;
}
I&
@ -155,8 +159,8 @@ namespace lib {
return data_->subscript (idx);
}
I& front() { return operator[] (size_-1); }
I& back() { return operator[] (0); }
I& front() { return operator[] (data_? data_->size_-1 : 0); }
I& back() { return operator[] (0); }
using iterator = I*;
using const_iterator = I const*;
@ -174,7 +178,7 @@ namespace lib {
discardData()
{
if (data_ and data_->deleter)
(*data_->deleter) (data_, size_);
(*data_->deleter) (data_);
}
};

View file

@ -81809,6 +81809,51 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1717796539825" ID="ID_719213336" MODIFIED="1717797044756" TEXT="Umbau Storage: alle Metadaten in das ArrayBucket verlagern">
<linktarget COLOR="#af28b1" DESTINATION="ID_719213336" ENDARROW="Default" ENDINCLINATION="-878;40;" ID="Arrow_ID_1140258959" SOURCE="ID_505052942" STARTARROW="None" STARTINCLINATION="-190;-16;"/>
<icon BUILTIN="pencil"/>
<node CREATED="1717796640496" ID="ID_962872298" MODIFIED="1717796742452" TEXT="Begr&#xfc;ndung: Raum f&#xfc;r zuk&#xfc;nftige Optimierungen schaffen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
Kann derzeit keine befriedigende L&#246;sung f&#252;r die diversen Zielkonflikte finden. Daher w&#228;hle ich eine L&#246;sung, die Raum f&#252;r zuk&#252;nftige L&#246;sungen schafft, und aktuell im Basisfall einfach und gradlinig zu implementieren ist. Speicher-Mehrverbrauch f&#252;r die Metadaten wird in Kauf genommen
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="info"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796744022" ID="ID_37258983" MODIFIED="1717796967258" TEXT="cnt-Parameter in das ArrayBucket">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796758675" ID="ID_307915281" MODIFIED="1717797027645" TEXT="neue size()-Methode">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796764642" ID="ID_1761107240" MODIFIED="1717797027646" TEXT="diese konsequent einsetzen im Builder">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796968326" ID="ID_992819253" MODIFIED="1717797326906" TEXT="buffSiz-Parameter (raw storage size)">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796995074" ID="ID_535611702" MODIFIED="1717797027646" TEXT="alle Zugriffe aus dem Builder verlagern">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717797008138" ID="ID_988757676" MODIFIED="1717797027647" TEXT="Allokation / Deallokation umschreiben">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717797674913" ID="ID_1290234834" MODIFIED="1717797679937" TEXT="Iteration">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717797702893" ID="ID_1535587090" MODIFIED="1717797708437" TEXT="Layout">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717797709076" ID="ID_1453437458" MODIFIED="1717797713403" TEXT="const-Iterator">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716901733807" ID="ID_955318801" MODIFIED="1716901736839" TEXT="Typdefinition">
<icon BUILTIN="flag-yellow"/>
@ -82162,7 +82207,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1717539298319" ID="ID_1107472699" MODIFIED="1717539362752" TEXT="sowie einen Move-Handler"/>
<node CREATED="1717539382219" ID="ID_1846112682" MODIFIED="1717539408547" TEXT="kann (abh&#xe4;ngig vom Typ) auf memmove zur&#xfc;ckfallen"/>
</node>
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717539604663" TEXT="erweiterte Flexibilit&#xe4;t nur im Einzelfall">
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717794723639" TEXT="erweiterte Flexibilit&#xe4;t nur im Einzelfall">
<linktarget COLOR="#705cb0" DESTINATION="ID_664027664" ENDARROW="Default" ENDINCLINATION="-687;54;" ID="Arrow_ID_440255158" SOURCE="ID_1613672201" STARTARROW="None" STARTINCLINATION="395;-572;"/>
<node CREATED="1717539630550" ID="ID_1134893118" MODIFIED="1717539634513" TEXT="Bedingungen">
<node CREATED="1717539636925" ID="ID_1442794254" MODIFIED="1717540858927" TEXT="Deleter">
<linktarget COLOR="#d90152" DESTINATION="ID_1442794254" ENDARROW="Default" ENDINCLINATION="2;12;" ID="Arrow_ID_92396700" SOURCE="ID_1347402773" STARTARROW="None" STARTINCLINATION="-2;-10;"/>
@ -82345,7 +82391,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1717723564508" ID="ID_16935134" MODIFIED="1717723623192" TEXT="verwende eine AllocationPolicy">
<icon BUILTIN="idea"/>
<node CREATED="1717723580796" ID="ID_453265164" MODIFIED="1717723597659" TEXT="der Builder erbt von dieser (Policy Mix-In)"/>
<node CREATED="1717723580796" ID="ID_453265164" MODIFIED="1717796591123" TEXT="der Builder erbt von dieser (Policy Mix-In)"/>
<node CREATED="1717723599686" ID="ID_1353907596" MODIFIED="1717723615688" TEXT="sie mischt ihrerseits eine ElementFactory ein"/>
<node CREATED="1717723625139" ID="ID_1954915705" MODIFIED="1717723635781" TEXT="Adapter-Methoden">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717723636675" ID="ID_1612255322" MODIFIED="1717723717303" TEXT="realloc">
@ -82466,7 +82512,8 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1717772041335" ID="ID_871652702" MODIFIED="1717772085852" TEXT="wenn nicht, dann verschwenden wir im AllocationCluster den ganzen bisherigen Platz"/>
<node CREATED="1717772086536" ID="ID_1322940252" MODIFIED="1717772099619" TEXT="und f&#xfc;r Heap-Allokation m&#xfc;ssen wir zumindest noch einmal alles umkopieren"/>
</node>
<node CREATED="1717773260668" ID="ID_1403509932" MODIFIED="1717773690731" TEXT="das ArrayBucket dynamisch flexibel machen">
<node CREATED="1717773260668" ID="ID_1403509932" MODIFIED="1717796516735" TEXT="das ArrayBucket dynamisch flexibel machen">
<arrowlink COLOR="#5a38d9" DESTINATION="ID_505052942" ENDARROW="Default" ENDINCLINATION="83;-42;" ID="Arrow_ID_1081178000" STARTARROW="None" STARTINCLINATION="-249;16;"/>
<icon BUILTIN="forward"/>
<node CREATED="1717773280353" ID="ID_1332303474" MODIFIED="1717773295509" TEXT="alle weiteren Metadaten liegen im ArrayBucket"/>
<node CREATED="1717773296351" ID="ID_129834213" MODIFIED="1717773606110" TEXT="dabei wird ein spezielles optimiertes Placement verwendet">
@ -82512,6 +82559,11 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717796486424" ID="ID_505052942" MODIFIED="1717796637654" TEXT="Konsequenz: Storage umbauen">
<arrowlink COLOR="#af28b1" DESTINATION="ID_719213336" ENDARROW="Default" ENDINCLINATION="-878;40;" ID="Arrow_ID_1140258959" STARTARROW="None" STARTINCLINATION="-190;-16;"/>
<linktarget COLOR="#5a38d9" DESTINATION="ID_505052942" ENDARROW="Default" ENDINCLINATION="83;-42;" ID="Arrow_ID_1081178000" SOURCE="ID_1403509932" STARTARROW="None" STARTINCLINATION="-249;16;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1716914864769" ID="ID_966642586" MODIFIED="1716914906125" TEXT="Builder-Operationen">
@ -82545,6 +82597,68 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717794532666" ID="ID_1285152534" MODIFIED="1717794548161" TEXT="Implementierungs-Logik aufbauen">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1717794550220" ID="ID_1034302214" MODIFIED="1717794631737" TEXT="das ist hier eine besondere Herausforderung....">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<body>
<p>
...aufgrund der Flexibilit&#228;t ist das intendierte Verhalten nicht mehr einfach zu fassen; es ist eigens ein Zugangsweg zu finden, um die richtige Logik zu entwickeln---
</p>
</body>
</html>
</richcontent>
<icon BUILTIN="messagebox_warning"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1717794645742" ID="ID_1610453521" MODIFIED="1717796458652" TEXT="Methode: den Lebenszyklus konzeptionell durchgehen">
<icon BUILTIN="idea"/>
<node CREATED="1717794669044" ID="ID_1613672201" MODIFIED="1717794729917" TEXT="jeweils mit einer Fall-Matrix gem&#xe4;&#xdf; der Analyse f&#xfc;r die Strategy">
<arrowlink COLOR="#705cb0" DESTINATION="ID_664027664" ENDARROW="Default" ENDINCLINATION="-687;54;" ID="Arrow_ID_440255158" STARTARROW="None" STARTINCLINATION="395;-572;"/>
<node CREATED="1717794737452" ID="ID_278791490" MODIFIED="1717794747831" TEXT="Fall-1: nur I-Typ"/>
<node CREATED="1717794750136" ID="ID_1341132567" MODIFIED="1717794763193" TEXT="Fall-2: nur E-Typ"/>
<node CREATED="1717794797376" ID="ID_1614454282" MODIFIED="1717794862723" TEXT="Fall-3: I-virtual + beliebiger Typ"/>
<node CREATED="1717794863870" ID="ID_1744905855" MODIFIED="1717794987440" TEXT="Fall-4: beliebiger Typ trivial destruierbar"/>
<node CREATED="1717794989572" ID="ID_1176145628" MODIFIED="1717795037217" TEXT="Fall-5: beliebiger Typ trivial kopierbar"/>
</node>
<node CREATED="1717795050251" ID="ID_1618287944" MODIFIED="1717795089492" TEXT="reserve">
<node CREATED="1717795145325" ID="ID_186385663" MODIFIED="1717795213297" TEXT="Fall-1: reserve nach Anzahl-I"/>
<node CREATED="1717795201741" ID="ID_1025461540" MODIFIED="1717795209418" TEXT="Fall-2: reserve nach Anzahl-E"/>
<node CREATED="1717795224865" ID="ID_1495514903" MODIFIED="1717795323758" TEXT="Fall3+4+5: reserve frei (cnt, size)"/>
</node>
<node CREATED="1717795090715" ID="ID_921338481" MODIFIED="1717795104887" TEXT="construct nach reserve">
<node CREATED="1717795334309" ID="ID_316562540" MODIFIED="1717795453788" TEXT="Fall-1+2 : spread pa&#xdf;t"/>
<node CREATED="1717795455247" ID="ID_297247338" MODIFIED="1717795472585" TEXT="Fall-3a : spread pa&#xdf;t"/>
<node CREATED="1717795473180" ID="ID_97000651" MODIFIED="1717795484438" TEXT="Fall-3b : spread zu klein"/>
<node CREATED="1717795513454" ID="ID_849597121" MODIFIED="1717795533783" TEXT="Fall-4a : spread pa&#xdf;t"/>
<node CREATED="1717795534452" ID="ID_1159542667" MODIFIED="1717795551575" TEXT="Fall-4b : spread zu klein"/>
<node CREATED="1717795553544" ID="ID_1475405867" MODIFIED="1717795587727" TEXT="Fall-5 &#x27f5; setzt hier Fall-3 oder Fall-4 vorraus"/>
</node>
<node CREATED="1717795105446" ID="ID_521456032" MODIFIED="1717795111470" TEXT="construct ohne reserve">
<node CREATED="1717795620731" ID="ID_635123753" MODIFIED="1717795661252" TEXT="Fall-1+2 : re-alloc mit typisiertem Umkopieren"/>
<node CREATED="1717795703860" ID="ID_541950278" MODIFIED="1717795768841" TEXT="Fall-3+4 : ablehnen falls nicht zus&#xe4;tzlich Fall-5"/>
<node CREATED="1717795883682" ID="ID_1529197297" MODIFIED="1717795899091" TEXT="Fall-5 : re-allok mit wildem Umkopieren"/>
<node CREATED="1717795900408" ID="ID_511193542" MODIFIED="1717796123193" TEXT="Fall-2 nachdem Fall-3&#x2228;4&#x2228;5 akzeptiert wurden"/>
</node>
<node CREATED="1717796225594" ID="ID_1719530802" MODIFIED="1717796230333" TEXT="shrink">
<node CREATED="1717796237416" ID="ID_1428799342" MODIFIED="1717796241988" TEXT="Fall-1+2"/>
<node CREATED="1717796253167" ID="ID_1948319624" MODIFIED="1717796265537" TEXT="Fall-3+4 ablehnen"/>
<node CREATED="1717796266269" ID="ID_659532485" MODIFIED="1717796275088" TEXT="Fall-5 verdichten"/>
</node>
<node CREATED="1717795121489" ID="ID_164626440" MODIFIED="1717795126964" TEXT="build">
<node CREATED="1717796279111" ID="ID_1604852394" MODIFIED="1717796304636" TEXT="Fall-1+2 : typisierter Destruktor"/>
<node CREATED="1717796306103" ID="ID_479956285" MODIFIED="1717796326009" TEXT="Fall-3 : typisierter I-Destruktor"/>
<node CREATED="1717796329980" ID="ID_1907620242" MODIFIED="1717796400776" TEXT="Fall-4 : de-Allokation ohne Destruktor"/>
<node CREATED="1717795553544" ID="ID_1998858503" MODIFIED="1717796416293" TEXT="Fall-5 &#x27f5; setzt Fall-3 oder Fall-4 vorraus"/>
</node>
<node CREATED="1717795128952" ID="ID_719222726" MODIFIED="1717795131555" TEXT="destroy">
<node CREATED="1717796441574" ID="ID_664881652" MODIFIED="1717796445977" TEXT="mit Destruktor"/>
<node CREATED="1717796446579" ID="ID_229190267" MODIFIED="1717796449135" TEXT="unmanaged"/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1715625082614" ID="ID_1575150785" MODIFIED="1715625089779" TEXT="SeveralBuilder_test">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1716857382440" ID="ID_46730448" MODIFIED="1716857402102" TEXT="simpleUsage">