Scheduler: rationalise delay decision logic

...especially for the case »outgoing to sleep«

- reorganise switch-case to avoid falling through
- properly handle the tendedNext() predicate also in boundrary cases
- structure the decision logic clearer
- cover the new behaviour in test

Remark: when the queue falls empty, the scheduler now sends each
worker once into a targted re-shuffling delay, to ensure the
sleep-cycles are statistically evenly spaced
This commit is contained in:
Fischlurch 2023-10-27 03:15:34 +02:00
parent b5e9d67a79
commit e26d251867
5 changed files with 141 additions and 85 deletions

View file

@ -82,7 +82,7 @@
//#include "vault/gear/activity-lang.hpp"
//#include "lib/symbol.hpp"
#include "lib/nocopy.hpp"
//#include "lib/util.hpp"
#include "lib/util.hpp"
//#include <string>
#include <chrono>
@ -152,13 +152,14 @@ namespace gear {
public:
/**
* did we already tend for the indicated next head time?
* did we already tend for the indicated next relevant head time?
* @note const and non-grooming
*/
bool
tendedNext (Time nextHead) const
{
return nextHead == tendedHead_;
return not nextHead.isRegular() // note: empty queue reports Time::NEVER
or nextHead == tendedHead_;
}
/**
@ -202,7 +203,6 @@ namespace gear {
Capacity
markOutgoingCapacity (Time head, Time now)
{
if (head == Time::NEVER) return IDLEWAIT; // empty queue
auto horizon = classifyTimeHorizon (Offset{head - now});
return horizon > SPINTIME
and not tendedNext(head)? TENDNEXT
@ -247,19 +247,20 @@ namespace gear {
return TimeValue{wrap};
};
TimeVar headDistance = util::max (tendedHead_-now, Time::ZERO);
switch (capacity) {
case DISPATCH:
return Offset::ZERO;
case SPINTIME:
return Offset::ZERO;
case TENDNEXT:
return Offset{tendedHead_-now};
return Offset{headDistance};
case NEARTIME:
return Offset{tendedHead_-now + scatter(WORK_HORIZON)};
return Offset{headDistance + scatter(WORK_HORIZON)};
case WORKTIME:
return Offset{tendedHead_-now + scatter(SLEEP_HORIZON)};
case IDLEWAIT:
return Offset{/*no base offset*/ scatter(SLEEP_HORIZON)};
return Offset{headDistance + scatter(SLEEP_HORIZON)};
default:
NOTREACHED ("uncovered work capacity classification.");
}

View file

@ -363,28 +363,36 @@ namespace gear {
inline activity::Proc
Scheduler::scatteredDelay (Time now, LoadController::Capacity capacity)
{
auto doTargetedSleep = [&]
{
Offset targetedDelay = loadControl_.scatteredDelayTime (now, capacity);
std::this_thread::sleep_for (std::chrono::microseconds (_raw(targetedDelay)));
};
auto doTendNextHead = [&]
{
Time head = layer1_.headTime();
auto self = std::this_thread::get_id();
if (not loadControl_.tendedNext(head)
and (layer2_.holdsGroomingToken(self)
or layer2_.acquireGoomingToken()))
loadControl_.tendNext(head);
};
switch (capacity) {
case LoadController::DISPATCH:
return activity::PASS;
case LoadController::SPINTIME:
std::this_thread::yield();
return activity::SKIP;
return activity::SKIP; // prompts to abort chain but call again immediately
case LoadController::IDLEWAIT:
return activity::WAIT;
return activity::WAIT; // prompts to switch this thread into sleep mode
case LoadController::TENDNEXT:
{
Time head = layer1_.headTime();
auto self = std::this_thread::get_id();
if (not loadControl_.tendedNext(head)
and (layer2_.holdsGroomingToken(self)
or layer2_.acquireGoomingToken()))
loadControl_.tendNext(head);
}// Fall-through to perform targeted wait
// @suppress("No break at end of case")
doTendNextHead();
doTargetedSleep(); // let this thread wait until nest head time is due
return activity::SKIP;
default:
Offset targetedDelay = loadControl_.scatteredDelayTime (now, capacity);
std::this_thread::sleep_for (std::chrono::microseconds (_raw(targetedDelay)));
return activity::SKIP; // indicates to abort this processing-chain for good
doTargetedSleep();
return activity::SKIP; // prompts to abort this processing-chain for good
}
}

View file

@ -269,7 +269,9 @@ namespace test {
CHECK ( ten == lctrl.scatteredDelayTime (now, Capacity::TENDNEXT) );
CHECK (is_between ( ten, ten+ WORK_HORIZON, lctrl.scatteredDelayTime (now, Capacity::NEARTIME)));
CHECK (is_between ( ten, ten+SLEEP_HORIZON, lctrl.scatteredDelayTime (now, Capacity::WORKTIME)));
CHECK (is_between (Time::ZERO, SLEEP_HORIZON, lctrl.scatteredDelayTime (now, Capacity::IDLEWAIT)));
CHECK (is_between ( ten, ten+SLEEP_HORIZON, lctrl.scatteredDelayTime (now, Capacity::IDLEWAIT)));
lctrl.tendNext(Time::ANYTIME); // reset to ensure we get no base offset
// Offset is randomised based on the current time
// Verify this yields an even distribution

View file

@ -100,6 +100,10 @@ namespace test {
* - this implies we can show timing-delay effects in the millisecond range
* - demonstrated behaviour
* + an Activity already due will be dispatched immediately by post()
* @note Invoke the Activity probe itself can take 50..150µs, due to the EventLog,
* which is not meant to be used in performance critical paths but only for tests,
* because it performs lots of heap allocations and string operations. Moreover,
* we see additional cache effects after an extended sleep period.
* @todo WIP 10/23 🔁 define implement
*/
void
@ -153,7 +157,7 @@ namespace test {
cout << "pullWork() on empty queue..."<<endl;
pullWork(); // Call the work-Function on empty Scheduler queue
CHECK (activity::WAIT == res); // get immediately signalled to go to sleep
CHECK (activity::WAIT == res); // the result instructs this thread to go to sleep immediately
cout << "Due at pullWork()..."<<endl;
@ -165,11 +169,14 @@ namespace test {
sleep_for (100us); // wait beyond the planned start point (typically waits ~150µs or more)
pullWork();
CHECK (activity::WAIT == res);
CHECK (wasInvoked(start));
CHECK (scheduler.empty());
CHECK (delay_us < 500); // Note: the call itself can take 50..150µs, due to the EventLog in the testProbe
CHECK (slip_us < 500); // Note: also there is a slip of typically 100..200µs, because sleep waits longer
CHECK (slip_us < 300); // Note: typically there is a slip of 100..200µs, because sleep waits longer
CHECK (scheduler.empty()); // The scheduler is empty now and this thread will go to sleep,
CHECK (delay_us < 20000); // however the sleep-cycle is first re-shuffled by a wait between 0 ... 20ms
CHECK (activity::PASS == res); // this thread is instructed to check back once
pullWork();
CHECK (activity::WAIT == res); // ...yet since the queue is still empty, it is sent immediately to sleep
CHECK (delay_us < 20);
cout << "next some time ahead => up-front delay"<<endl;
@ -185,10 +192,13 @@ namespace test {
CHECK (delay_us < 1000);
pullWork(); // if we now re-invoke the work-Function as instructed...
CHECK (wasInvoked(start)); // then the next schedule is already slightly overdue and immediately invoked
CHECK (delay_us < 300); // Warning: this limit is dangerously tight
CHECK (slip_us < 500);
CHECK (activity::WAIT == res); // since there is nothing left in the Queue, we are instructed to sleep
CHECK (scheduler.empty());
CHECK (scheduler.empty()); // the queue is empty and thus this thread will be sent to sleep
CHECK (delay_us < 20000); // but beforehand the sleep-cycle is re-shuffled by a wait between 0 ... 20ms
CHECK (slip_us < 300);
CHECK (activity::PASS == res); // instruction to check back once
pullWork();
CHECK (activity::WAIT == res); // but next call will send this thread to sleep right away
CHECK (delay_us < 20);
cout << "follow-up with some distance => follow-up delay"<<endl;
@ -207,7 +217,7 @@ SHOW_EXPR(slip_us)
SHOW_EXPR(wasInvoked(start))
SHOW_EXPR(scheduler.empty())
CHECK (wasInvoked(start)); // Result: the first invocation happened immediately
CHECK (slip_us < 100);
CHECK (slip_us < 200);
CHECK (delay_us > 900); // yet this thread was afterwards kept in sleep to await the next one
CHECK (activity::PASS == res); // instruction to re-invoke immediately
CHECK (not scheduler.empty()); // since there is still work in the queue
@ -215,11 +225,12 @@ SHOW_EXPR(scheduler.empty())
start += t1ms; // (just re-adjust the reference point to calculate slip_us)
pullWork(); // re-invoke immediately as instructed
CHECK (wasInvoked(start)); // Result: also the next Activity has been dispatched
CHECK (delay_us < 300); // not much slip and delay
CHECK (slip_us < 300); // Remark: here we often see cache-effects, since last EventLog call is way back, due to the long sleep
CHECK (activity::WAIT == res); // since queue is empty, we are instructed to sleep
CHECK (slip_us < 400); // not much slip
CHECK (slip_us < 20000); // ...and the post-delay is used to re-shuffle the sleep cycle as usual
CHECK (activity::PASS == res); // since queue is empty, we will call back once...
CHECK (scheduler.empty());
pullWork();
CHECK (activity::WAIT == res); // and then go to sleep.
cout << detector.showLog()<<endl; // HINT: use this for investigation...
}

View file

@ -82231,6 +82231,15 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372042164" ID="ID_1272410719" MODIFIED="1698372168803" TEXT="Clock-Implementierung">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372415522" ID="ID_932191846" MODIFIED="1698372446765" TEXT="steady_clock verwenden">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372425329" ID="ID_291517829" MODIFIED="1698372449644" TEXT="k&#xf6;nnte man auch in vault::RealClock einbauen">
<icon BUILTIN="idea"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698004014170" ID="ID_359097355" MODIFIED="1698203266998" TEXT="Test">
<icon BUILTIN="flag-yellow"/>
<node COLOR="#435e98" CREATED="1698203252783" ID="ID_161810851" MODIFIED="1698240150155" TEXT="was kann man hier sinnvoll testen?">
@ -82403,9 +82412,16 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1697763821714" ID="ID_1158248288" MODIFIED="1697763853485" TEXT="vorerst nur eine Senke f&#xfc;r die WORKSTART|STOP-Activities">
<icon BUILTIN="yes"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372056954" ID="ID_70592894" MODIFIED="1698372163476" TEXT="&#x3bb;-work einbinden">
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372095829" ID="ID_259045952" MODIFIED="1698372163476" TEXT="&#x3bb;-done einbinden">
<icon BUILTIN="flag-yellow"/>
</node>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1697663918107" ID="ID_210862409" MODIFIED="1697675123151" TEXT="Load-Controller vorsehen">
<linktarget COLOR="#75769b" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-667;72;" ID="Arrow_ID_1800712901" SOURCE="ID_464175339" STARTARROW="None" STARTINCLINATION="-540;37;"/>
<linktarget COLOR="#af587f" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" SOURCE="ID_1110932778" STARTARROW="None" STARTINCLINATION="250;17;"/>
<icon BUILTIN="flag-pink"/>
<node BACKGROUND_COLOR="#f8f1cb" COLOR="#a50125" CREATED="1697808322602" ID="ID_1787549088" MODIFIED="1697808340997" TEXT="Entwickelt sich wohl in Richtung einer Steuerzentrale">
<icon BUILTIN="messagebox_warning"/>
@ -82588,6 +82604,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="messagebox_warning"/>
</node>
<node CREATED="1697936244473" ID="ID_671338782" MODIFIED="1697936373448" TEXT="der Tick kann feststellen, da&#xdf; nur er selber als n&#xe4;chstes ansteht">
<arrowlink COLOR="#fffcc5" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="579;-95;" ID="Arrow_ID_1801107947" STARTARROW="None" STARTINCLINATION="292;11;"/>
<icon BUILTIN="idea"/>
</node>
</node>
@ -83151,7 +83168,9 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698159441179" ID="ID_486995126" MODIFIED="1698159446891" TEXT="Scheduler-Tick">
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698159441179" ID="ID_486995126" MODIFIED="1698372610717" TEXT="Scheduler-Tick">
<linktarget COLOR="#994d72" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" SOURCE="ID_1391329454" STARTARROW="None" STARTINCLINATION="71;5;"/>
<linktarget COLOR="#fffcc5" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="579;-95;" ID="Arrow_ID_1801107947" SOURCE="ID_671338782" STARTARROW="None" STARTINCLINATION="292;11;"/>
<icon BUILTIN="flag-yellow"/>
</node>
</node>
@ -83161,6 +83180,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="pencil"/>
</node>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372200013" ID="ID_1863445864" MODIFIED="1698372206543" TEXT="Scheduler start/stop">
<icon BUILTIN="flag-yellow"/>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372207398" ID="ID_1110932778" MODIFIED="1698372310208" TEXT="braucht Integration mit LoadController">
<arrowlink COLOR="#af587f" DESTINATION="ID_210862409" ENDARROW="Default" ENDINCLINATION="-33;645;" ID="Arrow_ID_204955453" STARTARROW="None" STARTINCLINATION="250;17;"/>
<icon BUILTIN="flag-yellow"/>
</node>
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372288228" ID="ID_1391329454" MODIFIED="1698372361257" TEXT="richtiges Zusammenspiel mit dem Tick">
<arrowlink COLOR="#994d72" DESTINATION="ID_486995126" ENDARROW="Default" ENDINCLINATION="-91;14;" ID="Arrow_ID_973238030" STARTARROW="None" STARTINCLINATION="71;5;"/>
<icon BUILTIN="flag-yellow"/>
<node CREATED="1698372366569" HGAP="31" ID="ID_581955078" MODIFIED="1698372383660" TEXT="der Tick mus von selber stehen bleiben" VSHIFT="18"/>
<node CREATED="1698372384694" HGAP="25" ID="ID_1896236351" MODIFIED="1698372393274" TEXT="damit f&#xe4;llt die Queue leer"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698078367419" HGAP="-36" ID="ID_1532750540" MODIFIED="1698079050460" TEXT="offene Fragen" VSHIFT="11">
<linktarget COLOR="#713d56" DESTINATION="ID_1532750540" ENDARROW="Default" ENDINCLINATION="-2344;353;" ID="Arrow_ID_1939324405" SOURCE="ID_161990356" STARTARROW="None" STARTINCLINATION="1495;112;"/>
<icon BUILTIN="bell"/>
@ -88147,16 +88179,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698269686974" ID="ID_586911111" MODIFIED="1698269697257" TEXT="wie viel Genauigkeit kann man da &#xfc;berhaupt erwarten?"/>
<node CREATED="1698269698148" ID="ID_220147663" MODIFIED="1698269740149" TEXT="RealClock::wasRecently setzt 1ms an">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und das erscheint ad&#228;quat f&#252;r moderne Maschinen
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#eef0c5" COLOR="#990000" CREATED="1698269741040" ID="ID_868809913" MODIFIED="1698269752607" TEXT="verusche mal mein Gl&#xfc;ck mit 500&#xb5;s">
<icon BUILTIN="pencil"/>
@ -88177,13 +88206,19 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698243881573" ID="ID_1520192624" MODIFIED="1698243892539" TEXT="es wird genau eine scheduled Activity aufgerufen"/>
<node CREATED="1698243927930" ID="ID_1326757783" MODIFIED="1698243935709" TEXT="die Zeit wird in etwa eingehalten"/>
<node CREATED="1698243794737" ID="ID_1290805695" MODIFIED="1698243800463" TEXT="das Delay-Regime">
<node COLOR="#435e98" CREATED="1698243828655" ID="ID_763249245" MODIFIED="1698283821102" TEXT="Abstand davor &#x27f6; delay"/>
<node COLOR="#435e98" CREATED="1698243897342" ID="ID_1722957398" MODIFIED="1698284587766" TEXT="Abstand danch &#x27f6; delay"/>
<node CREATED="1698243973380" ID="ID_664100190" MODIFIED="1698244000012" TEXT="tendedNext &#x27f6; re-Fokussiert"/>
<node CREATED="1698245002134" ID="ID_1016395299" MODIFIED="1698245069840" TEXT="nichts danach &#x27f6; re-Distribution">
<linktarget COLOR="#758fa6" DESTINATION="ID_1016395299" ENDARROW="Default" ENDINCLINATION="302;-22;" ID="Arrow_ID_1135387860" SOURCE="ID_28419292" STARTARROW="None" STARTINCLINATION="246;369;"/>
<node COLOR="#338800" CREATED="1698243828655" ID="ID_763249245" MODIFIED="1698377479489" TEXT="Abstand davor &#x27f6; delay">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1698245073987" ID="ID_1953896637" MODIFIED="1698247362748" TEXT="leer &#x27f6; Schlaf">
<node COLOR="#338800" CREATED="1698243897342" ID="ID_1722957398" MODIFIED="1698377481239" TEXT="Abstand danch &#x27f6; delay">
<icon BUILTIN="button_ok"/>
</node>
<node CREATED="1698243973380" ID="ID_664100190" MODIFIED="1698244000012" TEXT="tendedNext &#x27f6; re-Fokussiert"/>
<node COLOR="#338800" CREATED="1698245002134" ID="ID_1016395299" MODIFIED="1698377444088" TEXT="nichts danach &#x27f6; re-Distribution">
<linktarget COLOR="#758fa6" DESTINATION="ID_1016395299" ENDARROW="Default" ENDINCLINATION="302;-22;" ID="Arrow_ID_1135387860" SOURCE="ID_28419292" STARTARROW="None" STARTINCLINATION="246;369;"/>
<linktarget COLOR="#76a2bf" DESTINATION="ID_1016395299" ENDARROW="Default" ENDINCLINATION="334;25;" ID="Arrow_ID_318616986" SOURCE="ID_506319711" STARTARROW="None" STARTINCLINATION="186;-10;"/>
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698245073987" ID="ID_1953896637" MODIFIED="1698377472196" TEXT="leer &#x27f6; Schlaf">
<icon BUILTIN="button_ok"/>
</node>
</node>
@ -88220,40 +88255,44 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698284676624" ID="ID_298507876" MODIFIED="1698284714617" TEXT="sleep_for() schl&#xe4;ft meist mindestens 100&#xb5;s l&#xe4;nger"/>
<node CREATED="1698284725963" ID="ID_1453000254" MODIFIED="1698284777544" TEXT="das h&#xe4;ngt &#xfc;berhaupt nicht mit den Laufzeiten zusammen">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
also optimized vs. Debug-Build; ja man sieht diesen Unterschied im &quot;slip&quot;, weil einfach die Verarbeitung l&#228;nger dauert
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#fafe99" COLOR="#fa002a" CREATED="1698285072189" ID="ID_1552477309" MODIFIED="1698285083854" TEXT="Logik-Fehler mit tendNext">
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698285072189" ID="ID_1552477309" MODIFIED="1698377307677" TEXT="Logik-Fehler mit tendNext">
<icon BUILTIN="broken-line"/>
<node CREATED="1698285085530" ID="ID_991445216" MODIFIED="1698285104841">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
habe generell hier den Fall der <i>leeren Queue </i>nicht bedacht
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
<node BACKGROUND_COLOR="#e0ceaa" COLOR="#690f14" CREATED="1698285116679" ID="ID_496699258" MODIFIED="1698285143092" TEXT="Logik versucht auf Time::NEVER zu warten">
<icon BUILTIN="ksmiletris"/>
</node>
<node BACKGROUND_COLOR="#fdfdcf" COLOR="#ff0000" CREATED="1698285158209" ID="ID_506319711" MODIFIED="1698285203986" TEXT="korrekt w&#xe4;re: per Nach-Verz&#xf6;gerung die Schl&#xe4;fer umverteilen">
<node COLOR="#435e98" CREATED="1698285158209" ID="ID_506319711" MODIFIED="1698377451936" TEXT="korrekt w&#xe4;re: per Nach-Verz&#xf6;gerung die Schl&#xe4;fer umverteilen">
<arrowlink COLOR="#76a2bf" DESTINATION="ID_1016395299" ENDARROW="Default" ENDINCLINATION="334;25;" ID="Arrow_ID_318616986" STARTARROW="None" STARTINCLINATION="186;-10;"/>
<icon BUILTIN="forward"/>
<node COLOR="#338800" CREATED="1698377318108" ID="ID_362432031" MODIFIED="1698377343794" TEXT="tendedNext mu&#xdf; explizit die Rand-Zeiten korrekt ausschlie&#xdf;en">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698377347648" ID="ID_1378288233" MODIFIED="1698377384255" TEXT="au&#xdf;erdem wird outgoingCapacity stets zuletzt auf WORKTIME geschickt">
<icon BUILTIN="button_ok"/>
</node>
<node COLOR="#338800" CREATED="1698377369141" ID="ID_918735881" MODIFIED="1698377383438" TEXT="und in scatteredDelay ein offset sinnvoll eingerechtet">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node BACKGROUND_COLOR="#f0d5c5" COLOR="#990033" CREATED="1698284783980" ID="ID_40062147" MODIFIED="1698284826263" TEXT="warum sehe ich auch in den &#xbb;leer&#xab;-F&#xe4;llen einen delay ~ 100&#xb5;s ?">
</node>
<node COLOR="#435e98" CREATED="1698284783980" FOLDED="true" ID="ID_40062147" MODIFIED="1698371921286" TEXT="warum sehe ich auch in den &#xbb;leer&#xab;-F&#xe4;llen einen delay ~ 100&#xb5;s ?">
<font NAME="SansSerif" SIZE="12"/>
<icon BUILTIN="help"/>
<node CREATED="1698284852474" ID="ID_1979114462" MODIFIED="1698284871452" TEXT="Beispiel: der Fall &#xbb;Abstand danach&#xab;"/>
@ -88262,17 +88301,21 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698284926059" ID="ID_1262945790" MODIFIED="1698284978965" TEXT="Dispatch &#x27fc; sollte nur ca. 25&#xb5;s kosten"/>
<node CREATED="1698284937287" ID="ID_1614190627" MODIFIED="1698284953462" TEXT="danach nix &#x27fc; WAIT"/>
</node>
<node CREATED="1698284989240" ID="ID_787590297" MODIFIED="1698285028273" TEXT="Theorien">
<icon BUILTIN="idea"/>
<node CREATED="1698284992319" ID="ID_837253629" MODIFIED="1698285031113" TEXT="die Logik stimmt nicht und es wird doch geschlafen">
<icon BUILTIN="full-1"/>
<node COLOR="#435e98" CREATED="1698284989240" FOLDED="true" ID="ID_787590297" MODIFIED="1698371909726" TEXT="m&#xf6;gliche Gefahren...">
<icon BUILTIN="messagebox_warning"/>
<node COLOR="#5b280f" CREATED="1698284992319" ID="ID_837253629" MODIFIED="1698371886201" TEXT="die Logik stimmt nicht und es wird doch geschlafen">
<icon BUILTIN="button_cancel"/>
</node>
<node CREATED="1698285004782" ID="ID_667307245" MODIFIED="1698285033374" TEXT="die Implementierung der Kette hat ein Performance-Problem">
<icon BUILTIN="full-2"/>
<node COLOR="#5b280f" CREATED="1698285004782" ID="ID_667307245" MODIFIED="1698371886200" TEXT="die Implementierung der Kette hat ein Performance-Problem">
<icon BUILTIN="button_cancel"/>
</node>
</node>
<node COLOR="#338800" CREATED="1698287556673" ID="ID_1372932043" MODIFIED="1698368308498" TEXT="Untersuchung: instrumentieren">
<node COLOR="#338800" CREATED="1698371894587" ID="ID_735937248" MODIFIED="1698371900723" TEXT="beide explizit widerlegt">
<icon BUILTIN="button_ok"/>
</node>
</node>
<node COLOR="#435e98" CREATED="1698287556673" FOLDED="true" ID="ID_1372932043" MODIFIED="1698371825597" TEXT="Untersuchung: instrumentieren">
<icon BUILTIN="yes"/>
<icon BUILTIN="forward"/>
<node CREATED="1698287646293" ID="ID_1871424665" MODIFIED="1698287655991" TEXT="das scatteredDelay-Verhalten ist wie erwartet"/>
<node CREATED="1698287656675" ID="ID_320386665" MODIFIED="1698287664918" TEXT="die Zeit wird im Dispatch verbraucht">
<node CREATED="1698287748455" ID="ID_1506124813" MODIFIED="1698287762817" TEXT="sehe zwei Muster: ~50&#xb5;s und &gt; 100&#xb5;s"/>
@ -88283,16 +88326,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<icon BUILTIN="help"/>
<node COLOR="#5b280f" CREATED="1698290023095" ID="ID_244045665" MODIFIED="1698368206320" TEXT="die Activity-Probe? Invocation kostet 25&#xb5;s">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...und das ist so auch plausibel (interessanterweise gibt es hier keinen Unterschied debug/O3 )...&#160;&#160;hier wird ein Vector bef&#252;llt und jede Menge String-Konvertierungen gemacht, und auch ein virtual call
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<linktarget COLOR="#e0359d" DESTINATION="ID_244045665" ENDARROW="Default" ENDINCLINATION="634;35;" ID="Arrow_ID_555943254" SOURCE="ID_1132126993" STARTARROW="None" STARTINCLINATION="-19;-136;"/>
<icon BUILTIN="broken-line"/>
<node CREATED="1698368173278" HGAP="29" ID="ID_365964235" MODIFIED="1698368213973" TEXT="Me&#xdf;fehler..." VSHIFT="-8">
@ -88393,8 +88433,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
steckt in Activity::<b>callHook</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
<arrowlink COLOR="#ff1c0d" DESTINATION="ID_189228492" ENDARROW="Default" ENDINCLINATION="147;-184;" ID="Arrow_ID_431919133" STARTARROW="None" STARTINCLINATION="-30;57;"/>
<linktarget COLOR="#fe2672" DESTINATION="ID_1378612293" ENDARROW="Default" ENDINCLINATION="63;-82;" ID="Arrow_ID_787245495" SOURCE="ID_1387737580" STARTARROW="None" STARTINCLINATION="238;10;"/>
<icon BUILTIN="forward"/>
@ -88492,9 +88531,7 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
</node>
<node CREATED="1698367558424" ID="ID_46488042" MODIFIED="1698367603285" TEXT="Anmerkung: ich baue aber nicht die ganze Applikation from-scratch mit -O3">
<richcontent TYPE="NOTE"><html>
<head>
</head>
<head/>
<body>
<p>
...sondern nur die wenigen Translation-Units, die ich f&#252;r relevant halte. Das k&#246;nnte dann insgesamt nochmal einen Unterschied machen
@ -88520,16 +88557,13 @@ Date:&#160;&#160;&#160;Thu Apr 20 18:53:17 2023 +0200<br/>
<node CREATED="1698368434649" ID="ID_136517479" MODIFIED="1698368458717" TEXT="nur ein fester String ohne Zeit-Formatieren kostet 22&#xb5;s"/>
<node CREATED="1698368460513" ID="ID_1076705660" MODIFIED="1698368471860">
<richcontent TYPE="NODE"><html>
<head>
</head>
<head/>
<body>
<p>
Optimierung hat darauf <b>keinerlei Einflu&#223;</b>
</p>
</body>
</html>
</richcontent>
</html></richcontent>
</node>
</node>
</node>