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:
parent
154a7018be
commit
130a021020
3 changed files with 132 additions and 15 deletions
|
|
@ -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");
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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_);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -81809,6 +81809,51 @@ Date:   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ündung: Raum für zukünftige Optimierungen schaffen">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
Kann derzeit keine befriedigende Lösung für die diversen Zielkonflikte finden. Daher wähle ich eine Lösung, die Raum für zukünftige Lösungen schafft, und aktuell im Basisfall einfach und gradlinig zu implementieren ist. Speicher-Mehrverbrauch fü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:   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ängig vom Typ) auf memmove zurückfallen"/>
|
||||
</node>
|
||||
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717539604663" TEXT="erweiterte Flexibilität nur im Einzelfall">
|
||||
<node CREATED="1717539527558" ID="ID_664027664" MODIFIED="1717794723639" TEXT="erweiterte Flexibilitä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:   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:   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ür Heap-Allokation mü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:   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:   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ä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äß der Analyse fü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ßt"/>
|
||||
<node CREATED="1717795455247" ID="ID_297247338" MODIFIED="1717795472585" TEXT="Fall-3a : spread paß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ß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 ⟵ 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ä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∨4∨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 ⟵ 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">
|
||||
|
|
|
|||
Loading…
Reference in a new issue