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:
parent
b5e9d67a79
commit
e26d251867
5 changed files with 141 additions and 85 deletions
|
|
@ -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.");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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...
|
||||
}
|
||||
|
|
|
|||
|
|
@ -82231,6 +82231,15 @@ Date:   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ö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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1697763821714" ID="ID_1158248288" MODIFIED="1697763853485" TEXT="vorerst nur eine Senke für die WORKSTART|STOP-Activities">
|
||||
<icon BUILTIN="yes"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372056954" ID="ID_70592894" MODIFIED="1698372163476" TEXT="λ-work einbinden">
|
||||
<icon BUILTIN="flag-yellow"/>
|
||||
</node>
|
||||
<node BACKGROUND_COLOR="#eee5c3" COLOR="#990000" CREATED="1698372095829" ID="ID_259045952" MODIFIED="1698372163476" TEXT="λ-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:   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ß nur er selber als nä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:   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:   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ä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:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1698269686974" ID="ID_586911111" MODIFIED="1698269697257" TEXT="wie viel Genauigkeit kann man da ü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äquat fü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ück mit 500µs">
|
||||
<icon BUILTIN="pencil"/>
|
||||
|
|
@ -88177,13 +88206,19 @@ Date:   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 ⟶ delay"/>
|
||||
<node COLOR="#435e98" CREATED="1698243897342" ID="ID_1722957398" MODIFIED="1698284587766" TEXT="Abstand danch ⟶ delay"/>
|
||||
<node CREATED="1698243973380" ID="ID_664100190" MODIFIED="1698244000012" TEXT="tendedNext ⟶ re-Fokussiert"/>
|
||||
<node CREATED="1698245002134" ID="ID_1016395299" MODIFIED="1698245069840" TEXT="nichts danach ⟶ 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 ⟶ delay">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1698245073987" ID="ID_1953896637" MODIFIED="1698247362748" TEXT="leer ⟶ Schlaf">
|
||||
<node COLOR="#338800" CREATED="1698243897342" ID="ID_1722957398" MODIFIED="1698377481239" TEXT="Abstand danch ⟶ delay">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node CREATED="1698243973380" ID="ID_664100190" MODIFIED="1698244000012" TEXT="tendedNext ⟶ re-Fokussiert"/>
|
||||
<node COLOR="#338800" CREATED="1698245002134" ID="ID_1016395299" MODIFIED="1698377444088" TEXT="nichts danach ⟶ 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 ⟶ Schlaf">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
</node>
|
||||
|
|
@ -88220,40 +88255,44 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1698284676624" ID="ID_298507876" MODIFIED="1698284714617" TEXT="sleep_for() schläft meist mindestens 100µs länger"/>
|
||||
<node CREATED="1698284725963" ID="ID_1453000254" MODIFIED="1698284777544" TEXT="das hängt ü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 "slip", weil einfach die Verarbeitung lä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äre: per Nach-Verzögerung die Schläfer umverteilen">
|
||||
<node COLOR="#435e98" CREATED="1698285158209" ID="ID_506319711" MODIFIED="1698377451936" TEXT="korrekt wäre: per Nach-Verzögerung die Schlä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ß explizit die Rand-Zeiten korrekt ausschließen">
|
||||
<icon BUILTIN="button_ok"/>
|
||||
</node>
|
||||
<node COLOR="#338800" CREATED="1698377347648" ID="ID_1378288233" MODIFIED="1698377384255" TEXT="auß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 »leer«-Fällen einen delay ~ 100µs ?">
|
||||
</node>
|
||||
<node COLOR="#435e98" CREATED="1698284783980" FOLDED="true" ID="ID_40062147" MODIFIED="1698371921286" TEXT="warum sehe ich auch in den »leer«-Fällen einen delay ~ 100µs ?">
|
||||
<font NAME="SansSerif" SIZE="12"/>
|
||||
<icon BUILTIN="help"/>
|
||||
<node CREATED="1698284852474" ID="ID_1979114462" MODIFIED="1698284871452" TEXT="Beispiel: der Fall »Abstand danach«"/>
|
||||
|
|
@ -88262,17 +88301,21 @@ Date:   Thu Apr 20 18:53:17 2023 +0200<br/>
|
|||
<node CREATED="1698284926059" ID="ID_1262945790" MODIFIED="1698284978965" TEXT="Dispatch ⟼ sollte nur ca. 25µs kosten"/>
|
||||
<node CREATED="1698284937287" ID="ID_1614190627" MODIFIED="1698284953462" TEXT="danach nix ⟼ 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ö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µs und > 100µs"/>
|
||||
|
|
@ -88283,16 +88326,13 @@ Date:   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µs">
|
||||
<richcontent TYPE="NOTE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
...und das ist so auch plausibel (interessanterweise gibt es hier keinen Unterschied debug/O3 )...  hier wird ein Vector befü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ßfehler..." VSHIFT="-8">
|
||||
|
|
@ -88393,8 +88433,7 @@ Date:   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:   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ür relevant halte. Das könnte dann insgesamt nochmal einen Unterschied machen
|
||||
|
|
@ -88520,16 +88557,13 @@ Date:   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µs"/>
|
||||
<node CREATED="1698368460513" ID="ID_1076705660" MODIFIED="1698368471860">
|
||||
<richcontent TYPE="NODE"><html>
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<head/>
|
||||
<body>
|
||||
<p>
|
||||
Optimierung hat darauf <b>keinerlei Einfluß</b>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
</richcontent>
|
||||
</html></richcontent>
|
||||
</node>
|
||||
</node>
|
||||
</node>
|
||||
|
|
|
|||
Loading…
Reference in a new issue