Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ Update()

int int newSampleMs System.Threading.PortableThreadPool.HillClimbing.Update ( int currentThreadCount,
double sampleDurationSeconds,
int numCompletions )
inline

Definition at line 480 of file PortableThreadPool.cs.

481 {
482 if (currentThreadCount != _lastThreadCount)
483 {
484 ForceChange(currentThreadCount, StateOrTransition.Initializing);
485 }
486 _secondsElapsedSinceLastChange += sampleDurationSeconds;
487 _completionsSinceLastChange += numCompletions;
488 sampleDurationSeconds += _accumulatedSampleDurationSeconds;
489 numCompletions += _accumulatedCompletionCount;
490 if (_totalSamples > 0 && ((double)currentThreadCount - 1.0) / (double)numCompletions >= _maxSampleError)
491 {
492 _accumulatedSampleDurationSeconds = sampleDurationSeconds;
493 _accumulatedCompletionCount = numCompletions;
494 return (newThreadCount: currentThreadCount, newSampleMs: 10);
495 }
498 double num = (double)numCompletions / sampleDurationSeconds;
499 if (NativeRuntimeEventSource.Log.IsEnabled())
500 {
501 NativeRuntimeEventSource.Log.ThreadPoolWorkerThreadAdjustmentSample(num, 0);
502 }
503 int num2 = (int)(_totalSamples % _samplesToMeasure);
504 _samples[num2] = num;
505 _threadCounts[num2] = currentThreadCount;
507 Complex complex = default(Complex);
508 Complex complex2 = default(Complex);
509 double num3 = 0.0;
510 Complex complex3 = default(Complex);
511 double num4 = 0.0;
512 StateOrTransition state = StateOrTransition.Warmup;
513 int num5 = (int)Math.Min(_totalSamples - 1, _samplesToMeasure) / _wavePeriod * _wavePeriod;
514 if (num5 > _wavePeriod)
515 {
516 double num6 = 0.0;
517 double num7 = 0.0;
518 for (int i = 0; i < num5; i++)
519 {
520 num6 += _samples[(_totalSamples - num5 + i) % _samplesToMeasure];
521 num7 += _threadCounts[(_totalSamples - num5 + i) % _samplesToMeasure];
522 }
523 double num8 = num6 / (double)num5;
524 double num9 = num7 / (double)num5;
525 if (num8 > 0.0 && num9 > 0.0)
526 {
527 double period = (double)num5 / ((double)num5 / (double)_wavePeriod + 1.0);
528 double num10 = (double)num5 / ((double)num5 / (double)_wavePeriod - 1.0);
529 complex2 = GetWaveComponent(_samples, num5, _wavePeriod) / num8;
530 num3 = (GetWaveComponent(_samples, num5, period) / num8).Abs();
531 if (num10 <= (double)num5)
532 {
533 num3 = Math.Max(num3, (GetWaveComponent(_samples, num5, num10) / num8).Abs());
534 }
535 complex = GetWaveComponent(_threadCounts, num5, _wavePeriod) / num9;
536 if (_averageThroughputNoise == 0.0)
537 {
539 }
540 else
541 {
543 }
544 if (complex.Abs() > 0.0)
545 {
546 complex3 = (complex2 - _targetThroughputRatio * complex) / complex;
547 state = StateOrTransition.ClimbingMove;
548 }
549 else
550 {
551 complex3 = new Complex(0.0, 0.0);
552 state = StateOrTransition.Stabilizing;
553 }
554 double num11 = Math.Max(_averageThroughputNoise, num3);
555 num4 = ((!(num11 > 0.0)) ? 1.0 : (complex.Abs() / num11 / _targetSignalToNoiseRatio));
556 }
557 }
558 double num12 = Math.Min(1.0, Math.Max(-1.0, complex3.Real));
559 num12 *= Math.Min(1.0, Math.Max(0.0, num4));
560 double num13 = _maxChangePerSecond * sampleDurationSeconds;
561 num12 = Math.Pow(Math.Abs(num12), _gainExponent) * (double)((num12 >= 0.0) ? 1 : (-1)) * num13;
562 num12 = Math.Min(num12, _maxChangePerSample);
563 PortableThreadPool threadPoolInstance = ThreadPoolInstance;
564 if (num12 > 0.0 && threadPoolInstance._cpuUtilization > 95)
565 {
566 num12 = 0.0;
567 }
568 _currentControlSetting += num12;
570 val = Math.Min(val, _maxThreadWaveMagnitude);
571 val = Math.Max(val, 1);
572 int maxThreads = threadPoolInstance._maxThreads;
573 int minThreadsGoal = threadPoolInstance.MinThreadsGoal;
574 _currentControlSetting = Math.Min(maxThreads - val, _currentControlSetting);
575 _currentControlSetting = Math.Max(minThreadsGoal, _currentControlSetting);
576 int val2 = (int)(_currentControlSetting + (double)(val * (_totalSamples / (_wavePeriod / 2) % 2)));
577 val2 = Math.Min(maxThreads, val2);
578 val2 = Math.Max(minThreadsGoal, val2);
579 if (NativeRuntimeEventSource.Log.IsEnabled())
580 {
581 NativeRuntimeEventSource.Log.ThreadPoolWorkerThreadAdjustmentStats(sampleDurationSeconds, num, complex.Real, complex2.Real, num3, _averageThroughputNoise, complex3.Real, num4, _currentControlSetting, (ushort)val, 0);
582 }
583 if (val2 != currentThreadCount)
584 {
588 }
589 int item = ((!(complex3.Real < 0.0) || val2 != minThreadsGoal) ? _currentSampleMs : ((int)(0.5 + (double)_currentSampleMs * (10.0 * Math.Min(0.0 - complex3.Real, 1.0)))));
590 return (newThreadCount: val2, newSampleMs: item);
591 }
Complex GetWaveComponent(double[] samples, int numSamples, double period)
void ChangeThreadCount(int newThreadCount, StateOrTransition state)
void ForceChange(int newThreadCount, StateOrTransition state)
static readonly PortableThreadPool ThreadPoolInstance