Block-Flow: Load-Test indicates problem in Epoch control
...leading to PATHETICALLY bad timing comparison ...it seems clear that the Epoch-Step went to zero (which was neither anticipated, nor protected against) However, even individual heap allocations fare surprisingly well under full optimisation; just they don't solve our problem with tracking dependencies; the most simplest solution that would also fulfil this requirement would be using shared_ptr
This commit is contained in:
parent
c1001064e3
commit
c7d6f3e24c
2 changed files with 201 additions and 31 deletions
|
|
@ -35,6 +35,7 @@
|
|||
#include "lib/util.hpp"
|
||||
|
||||
//#include <utility>
|
||||
#include <chrono>
|
||||
#include <vector>
|
||||
#include <tuple>
|
||||
|
||||
|
|
@ -349,8 +350,9 @@ namespace test {
|
|||
void
|
||||
storageFlow()
|
||||
{
|
||||
const uint ACTIVITIES = 120000; // Activities to send through the test subject
|
||||
const uint MAX_TIME = 121000; // Test steps to perform, with 2 steps / ms
|
||||
const uint INSTANCES = 120000; // Activities to send through the test subject
|
||||
const uint MAX_TIME = 121000; // Test steps to perform
|
||||
const gavl_time_t STP = 500; // with 2 steps per ms
|
||||
Offset BASE_DEADLINE{FSecs{1,2}}; // base pre-roll before deadline
|
||||
Offset SPREAD_DEAD{FSecs{2,100}}; // random spread of deadline around base
|
||||
const uint INVOKE_LAG = 500; // „invoke“ the Activity after 500 steps (≙ simulated 250ms)
|
||||
|
|
@ -358,10 +360,9 @@ namespace test {
|
|||
|
||||
using TestData = vector<pair<TimeVar, size_t>>;
|
||||
using Subjects = vector<reference_wrapper<Activity>>;
|
||||
using Storage = vector<Activity>;
|
||||
|
||||
|
||||
TestData testData{ACTIVITIES};
|
||||
// pre-generate random test data
|
||||
TestData testData{INSTANCES};
|
||||
for (auto&[t,r] : testData)
|
||||
{
|
||||
const size_t SPREAD = 2*_raw(SPREAD_DEAD);
|
||||
|
|
@ -371,8 +372,8 @@ namespace test {
|
|||
t = TimeValue(MIN_DEAD + r);
|
||||
}
|
||||
|
||||
Activity dummy;
|
||||
Subjects subject{ACTIVITIES, std::ref(dummy)};
|
||||
Activity dummy; // reserve memory for test subject index
|
||||
Subjects subject{INSTANCES, std::ref(dummy)};
|
||||
|
||||
auto runTest = [&](auto allocate, auto invoke) -> size_t
|
||||
{
|
||||
|
|
@ -385,16 +386,104 @@ namespace test {
|
|||
size_t checksum{0};
|
||||
for (size_t i=0; i<MAX_TIME; ++i)
|
||||
{
|
||||
if (i < ACTIVITIES)
|
||||
if (i < INSTANCES)
|
||||
{
|
||||
auto const& data = testData[i];
|
||||
subject[i] = allocate(data.first, data.second);
|
||||
}
|
||||
if (i >= INVOKE_LAG)
|
||||
if (INVOKE_LAG <= i and i-INVOKE_LAG < INSTANCES)
|
||||
checksum += invoke(subject[i-INVOKE_LAG]);
|
||||
}
|
||||
return checksum;
|
||||
};
|
||||
|
||||
auto benchmark = [INSTANCES](auto invokeTest)
|
||||
{
|
||||
using std::chrono::system_clock;
|
||||
using Dur = std::chrono::duration<double>;
|
||||
const double SCALE = 1e9; // Results are in ns
|
||||
|
||||
auto start = system_clock::now();
|
||||
invokeTest();
|
||||
Dur duration = system_clock::now () - start;
|
||||
return duration.count()/(INSTANCES) * SCALE;
|
||||
};
|
||||
|
||||
|
||||
/* =========== Test-Setup-1: no individual allocations/deallocations ========== */
|
||||
size_t sum1{0};
|
||||
vector<Activity> storage{INSTANCES};
|
||||
auto noAlloc = [&]{ // use pre-allocated storage block
|
||||
auto allocate = [i=0, &storage](Time, size_t check) mutable -> Activity&
|
||||
{
|
||||
return *new(&storage[i++]) Activity{check, size_t{55}};
|
||||
};
|
||||
auto invoke = [](Activity& feedActivity)
|
||||
{
|
||||
return feedActivity.data_.feed.one;
|
||||
};
|
||||
|
||||
sum1 = runTest (allocate, invoke);
|
||||
};
|
||||
|
||||
|
||||
/* =========== Test-Setup-2: individual heap allocations ========== */
|
||||
size_t sum2{0};
|
||||
auto heapAlloc = [&]{
|
||||
auto allocate = [](Time, size_t check) mutable -> Activity&
|
||||
{
|
||||
return *new Activity{check, size_t{55}};
|
||||
};
|
||||
auto invoke = [](Activity& feedActivity)
|
||||
{
|
||||
size_t check = feedActivity.data_.feed.one;
|
||||
delete &feedActivity;
|
||||
return check;
|
||||
};
|
||||
|
||||
sum2 = runTest (allocate, invoke);
|
||||
};
|
||||
|
||||
|
||||
/* =========== Test-Setup-3: use BlockFlow allocation scheme ========== */
|
||||
size_t sum3{0};
|
||||
auto blockFlow = [&]{
|
||||
BlockFlow blockFlow;
|
||||
auto allocate = [&](Time t, size_t check) mutable -> Activity&
|
||||
{
|
||||
return blockFlow.until(t).create (check, size_t{55});
|
||||
};
|
||||
auto invoke = [&, i=0](Activity& feedActivity) mutable
|
||||
{
|
||||
size_t check = feedActivity.data_.feed.one;
|
||||
if (i % CLEAN_UP == 0)
|
||||
blockFlow.discardBefore (Time{TimeValue{i*STP}});
|
||||
return check;
|
||||
};
|
||||
|
||||
sum3 = runTest (allocate, invoke);
|
||||
//SHOW_EXPR(watch(blockFlow).cntEpochs())
|
||||
//SHOW_EXPR(watch(blockFlow).poolSize())
|
||||
//SHOW_EXPR(watch(blockFlow).first())
|
||||
//SHOW_EXPR(watch(blockFlow).last())
|
||||
//SHOW_EXPR(_raw(blockFlow.getEpochStep()))
|
||||
//SHOW_EXPR(watch(blockFlow).allEpochs())
|
||||
};
|
||||
|
||||
// INVOKE Setup-1
|
||||
auto time_noAlloc = benchmark(noAlloc);
|
||||
SHOW_EXPR(time_noAlloc)
|
||||
SHOW_EXPR(sum1);
|
||||
|
||||
// INVOKE Setup-2
|
||||
auto time_heapAlloc = benchmark(heapAlloc);
|
||||
SHOW_EXPR(time_heapAlloc)
|
||||
SHOW_EXPR(sum2);
|
||||
|
||||
// INVOKE Setup-3
|
||||
auto time_blockFlow = benchmark(blockFlow);
|
||||
SHOW_EXPR(time_blockFlow)
|
||||
SHOW_EXPR(sum3);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -78919,9 +78919,9 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689199850230" ID="ID_500959752" MODIFIED="1689199853830" TEXT="storageFlow">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689202692911" ID="ID_906364025" MODIFIED="1689560760573" TEXT="Massentest zur Performance-Messung">
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1689202692911" ID="ID_906364025" MODIFIED="1689639989685" TEXT="Massentest zur Performance-Messung">
|
||||
<linktarget COLOR="#a03b66" DESTINATION="ID_906364025" ENDARROW="Default" ENDINCLINATION="-1525;104;" ID="Arrow_ID_849510703" SOURCE="ID_1170043916" STARTARROW="None" STARTINCLINATION="455;-1256;"/>
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1689607803699" ID="ID_620009729" MODIFIED="1689609183664" TEXT="Default-Init-Parameter">
|
||||
<icon BUILTIN="info"/>
|
||||
<node CREATED="1689608995574" ID="ID_1382602336" MODIFIED="1689608995574" TEXT="EPOCH_SIZ = 100"/>
|
||||
|
|
@ -78962,8 +78962,8 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1689611710754" ID="ID_488317579" MODIFIED="1689611720732" TEXT="alle 100ms ein clean-up"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560632798" ID="ID_1959869883" MODIFIED="1689560652584" TEXT="probabilistische Füllung verwenden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560632798" ID="ID_1959869883" MODIFIED="1689639978410" TEXT="probabilistische Füllung verwenden">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node CREATED="1689610738613" ID="ID_981353581" MODIFIED="1689610750951" TEXT="System wird synchron Ende-zu-Ende unter Druck gesetzt"/>
|
||||
<node CREATED="1689610757842" ID="ID_1665227842" MODIFIED="1689610778211" TEXT="erzeuge im Vorlauf die Zufallsdaten">
|
||||
<node CREATED="1689610814059" ID="ID_887238999" MODIFIED="1689610825598" TEXT="Zufallszahl als Prüfsumme"/>
|
||||
|
|
@ -78985,16 +78985,16 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1689611766050" ID="ID_1445074536" MODIFIED="1689611771519" TEXT="λ2 : invoke"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560655505" ID="ID_341052414" MODIFIED="1689560698827" TEXT="Laufzeiten messen...">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560664792" ID="ID_1260345651" MODIFIED="1689560697628" TEXT="Konstruktion von Activities ohne Allokation">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560655505" ID="ID_341052414" MODIFIED="1689640004346" TEXT="Laufzeiten messen...">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
<node COLOR="#338800" CREATED="1689560664792" ID="ID_1260345651" MODIFIED="1689640001789" TEXT="Konstruktion von Activities ohne Allokation">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560679550" ID="ID_791902165" MODIFIED="1689560697628" TEXT="Konstruktion mit Heap-Allokation">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560679550" ID="ID_791902165" MODIFIED="1689640002703" TEXT="Konstruktion mit Heap-Allokation">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560687229" ID="ID_1878728733" MODIFIED="1689560697629" TEXT="Allokation via BlockFlow">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560687229" ID="ID_1878728733" MODIFIED="1689640003483" TEXT="Allokation via BlockFlow">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -80361,21 +80361,93 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<icon BUILTIN="flag-yellow"/>
|
||||
<node CREATED="1689607767280" ID="ID_1402491463" MODIFIED="1689607773610" TEXT="Analyse-Setup">
|
||||
<icon BUILTIN="info"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560462402" ID="ID_572069226" MODIFIED="1689560515277" TEXT="verwende probabilisitsche Füllung">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560462402" ID="ID_572069226" MODIFIED="1689640015674" TEXT="verwende probabilisitsche Füllung">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560474545" ID="ID_994558438" MODIFIED="1689560515277" TEXT="aber zentriert um einen erwarteten Durschnittswert">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
<node COLOR="#338800" CREATED="1689560474545" ID="ID_994558438" MODIFIED="1689640017220" TEXT="aber zentriert um einen erwarteten Durschnittswert">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689560488768" ID="ID_1380075970" MODIFIED="1689640023153" TEXT="beobachte, ob sich die Blocklängen-Regulierung entsprechend einpendelt">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689560507573" ID="ID_696357967" MODIFIED="1689640023154" TEXT="außerdem die Laufzeiten messen">
|
||||
<icon BUILTIN="pencil"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1689607779429" ID="ID_1970538924" MODIFIED="1689641013783" TEXT="Beobachtungen-1">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node COLOR="#338800" CREATED="1689640367882" ID="ID_986709872" MODIFIED="1689640380033" TEXT="alle drei Methoden laufen korrekt (gleiche Checksumme)">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689640055285" ID="ID_197017544" MODIFIED="1689640071415" TEXT="Meßwerte KATASTROPHAL daneben">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
<node CREATED="1689640076427" ID="ID_875462831" MODIFIED="1689640079093" TEXT="-O0">
|
||||
<node CREATED="1689640080105" ID="ID_178761327" MODIFIED="1689640750910" TEXT="noAlloc: 54ns"/>
|
||||
<node CREATED="1689640092880" ID="ID_1541861024" MODIFIED="1689640764832" TEXT="heapAlloc: 71ns"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689640103086" ID="ID_1735978679" MODIFIED="1689640128216" TEXT="blockFlow: 81794ns">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1689640132730" ID="ID_999730008" MODIFIED="1689640135149" TEXT="-O3">
|
||||
<node CREATED="1689640449871" ID="ID_223262207" MODIFIED="1689640861367" TEXT="noAlloc: 5.86ns"/>
|
||||
<node CREATED="1689640461957" ID="ID_1623175603" MODIFIED="1689640534287" TEXT="heapAlloc: 22.1ns"/>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689640536569" ID="ID_1227057004" MODIFIED="1689640576831" TEXT="blockFlow: 8360ns">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1689640146728" ID="ID_1549819920" MODIFIED="1689640170406" TEXT="Hinweise auf Blocksteuerung">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689640172272" ID="ID_581706192" MODIFIED="1689640208346" TEXT="Epoch-Step ist zuletzt 0">
|
||||
<icon BUILTIN="broken-line"/>
|
||||
</node>
|
||||
<node CREATED="1689640251816" ID="ID_1949878312" MODIFIED="1689640263863" TEXT="cntEpochs = 1213"/>
|
||||
<node CREATED="1689640251817" ID="ID_1511949915" MODIFIED="1689640273171" TEXT="poolSize = 1216"/>
|
||||
<node CREATED="1689640284158" ID="ID_1888282469" MODIFIED="1689640309034" TEXT="allEpochs() = "691ms|871ms|871ms|....""/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1689641016179" ID="ID_74333541" MODIFIED="1689641028236" TEXT="Feststellungen">
|
||||
<icon BUILTIN="forward"/>
|
||||
<node CREATED="1689641031264" ID="ID_1238488005" MODIFIED="1689641053369" TEXT="das Verhalten von noAlloc vs Heap-Alloc ist plausibel"/>
|
||||
<node CREATED="1689641054053" ID="ID_603208212" MODIFIED="1689641085816" TEXT="überraschend ist, daß heapAlloc derart gut performt">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
</node>
|
||||
<node COLOR="#821c75" CREATED="1689641127111" ID="ID_1286298004" MODIFIED="1689641173147" TEXT="eine lineare Suche durch 1200 Epochen ist .... KISS">
|
||||
<icon BUILTIN="smiley-oh"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1689641219655" ID="ID_1749403596" MODIFIED="1689641287016" TEXT="unklar ist: warum stehen die Deadlines auf derart niedrigen Werten?">
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1689641337033" ID="ID_1509984750" MODIFIED="1689641764772" TEXT="klar ist: bei Epoch-Step = 0 kommt er nicht mehr vom Fleck"/>
|
||||
<node CREATED="1689641404076" ID="ID_194676641" MODIFIED="1689641649749" TEXT="aber sollte nicht der clean-up dann alle Epochen wegräumen?"/>
|
||||
<node CREATED="1689642306772" ID="ID_1765800200" MODIFIED="1689642322971" TEXT="sollte dann nicht eine division-by-zero auftreten?"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689642371947" ID="ID_1406026816" MODIFIED="1689642405098" TEXT="insgesamt: möglicherweise ist das Konzept so nicht tragfähig">
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1689642408734" ID="ID_1850569145" MODIFIED="1689642449156" TEXT="schon die Parametrisierung für den Test zeit einen viel zu kleinen Hebel"/>
|
||||
<node CREATED="1689642450264" ID="ID_1125214093" MODIFIED="1689642537977" TEXT="es ist klar: die beiden anderen Varianten sind nicht skalierbar">
|
||||
<node CREATED="1689642540378" ID="ID_1216826442" MODIFIED="1689642547999" TEXT="wir brauchen Dauerbetrieb"/>
|
||||
<node CREATED="1689642549891" ID="ID_960993571" MODIFIED="1689642558846" TEXT="Heap fragmentiert im Lauf der Zeit"/>
|
||||
<node CREATED="1689642582295" ID="ID_1154028289" MODIFIED="1689642651289" TEXT="wir brauchen sichere Erkennung freiggebarer Records"/>
|
||||
</node>
|
||||
<node CREATED="1689642751072" ID="ID_1608372510" MODIFIED="1689642786257">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<p>
|
||||
aber: BlockFlow macht schon <b>verdammt viel</b> für jede Allokation
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
<icon BUILTIN="messagebox_warning"/>
|
||||
<node CREATED="1689643876317" ID="ID_639218463" MODIFIED="1689643891123" TEXT="im Vergleich zu einem feelist-Pool-Allocator"/>
|
||||
<node CREATED="1689643931937" ID="ID_43711490" MODIFIED="1689643963507" TEXT="die Epochen müssen wohl viel größer sein">
|
||||
<icon BUILTIN="idea"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560488768" ID="ID_1380075970" MODIFIED="1689560515278" TEXT="beobachte, ob sich die Blocklängen-Regulierung entsprechend einpendelt">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1689560507573" ID="ID_696357967" MODIFIED="1689560515278" TEXT="außerdem die Laufzeiten messen">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#d2beaf" COLOR="#5c4d6e" CREATED="1689607779429" ID="ID_1970538924" MODIFIED="1689607783608" TEXT="Feststellungen">
|
||||
<icon BUILTIN="hourglass"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -85863,6 +85935,15 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1689635395135" ID="ID_1740151872" MODIFIED="1689635403952" TEXT="Lmbda mutable capture">
|
||||
<node CREATED="1689635411410" ID="ID_1645232120" MODIFIED="1689635427836" TEXT="muß als Specifier angegeben werden"/>
|
||||
<node CREATED="1689635435623" ID="ID_543320478" MODIFIED="1689635448191" TEXT="normalerweise sind by-value captures read-only">
|
||||
<icon BUILTIN="info"/>
|
||||
</node>
|
||||
<node COLOR="#2a2f72" CREATED="1689635451445" ID="ID_1371714413" MODIFIED="1689635519780" TEXT="[x](Arg arg) mutable { /* body */ }">
|
||||
<font NAME="Monospaced" SIZE="12"/>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
<node CREATED="1482365430484" ID="ID_1414724077" MODIFIED="1557498707240" TEXT="chrono">
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1482365434203" ID="ID_1026694670" MODIFIED="1557498707240" TEXT="lernen">
|
||||
|
|
|
|||
Loading…
Reference in a new issue