// ========================= /// <summary> /// Допустим ли переход между состояниями /// </summary> /// <param name="curState">Исходное состояние</param> /// <param name="newState">Новое состояние</param> /// <returns>Допустимость</returns> private bool CanChangeState(ExecutionThroughoutTrackerUpSmartDownCorrectionState curState, ExecutionThroughoutTrackerUpSmartDownCorrectionState newState) { if (curState == newState) { return(true); } switch (curState) { case ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState: return(newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryIncrease || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryDecrease); case ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryIncrease: return(newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.Increasing || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryDecrease || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState); case ExecutionThroughoutTrackerUpSmartDownCorrectionState.Increasing: return(newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryIncrease || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryDecrease); case ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryDecrease: return(newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.Decreasing || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryIncrease || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState); case ExecutionThroughoutTrackerUpSmartDownCorrectionState.Decreasing: return(newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryIncrease || newState == ExecutionThroughoutTrackerUpSmartDownCorrectionState.TryDecrease); default: throw new InvalidOperationException("Unknown state: " + curState.ToString()); } }
/// <summary> /// Выполнить переход в состояние /// </summary> /// <param name="description">Описание причин перехода</param> /// <param name="state">Новое состояние</param> private void GoToState(string description, ExecutionThroughoutTrackerUpSmartDownCorrectionState state) { if (!CanChangeState(_state, state)) { throw new InvalidOperationException("Invalid state change from " + _state.ToString() + " to " + state.ToString()); } //Console.WriteLine(description + ". State = " + _state.ToString() + ", NewState = " + state.ToString()); if (_state != state) { _state = state; _enterStateTimeStamp = GetTimestamp(); _enterStateThroughoutData = this.GetCurrentMeasure(); _stateMeasureCount = 0; _tryIncreaseBlinkCount = 0; _tryDecreaseBlinkCount = 0; _tryDecreaseInitialThreadCount = -1; _optimalStateAverageThroughout = -1; TurboContract.Assert(_isPerfMeasureThreadWork == false, conditionString: "_isPerfMeasureThreadWork == false"); } }
/// <summary> /// Конструктор ExecutionThroughoutTrackerUpSmartDownCorrection /// </summary> /// <param name="maxThreadCount">Максимальное число потоков</param> /// <param name="reasonableThreadCount">Базовое число потоков</param> public ExecutionThroughoutTrackerUpSmartDownCorrection(int maxThreadCount, int reasonableThreadCount) { TurboContract.Requires(maxThreadCount > 0, conditionString: "maxThreadCount > 0"); TurboContract.Requires(reasonableThreadCount > 0, conditionString: "reasonableThreadCount > 0"); TurboContract.Requires(maxThreadCount >= reasonableThreadCount, conditionString: "maxThreadCount >= reasonableThreadCount"); _maxThreadCount = maxThreadCount; _reasonableThreadCount = reasonableThreadCount; _executedTasks = 0; _lastTimeStamp = GetTimestamp(); _data = new ThroughoutData[EstimationDataLength]; _nextDataIndex = 0; _state = ExecutionThroughoutTrackerUpSmartDownCorrectionState.InOptimalState; _enterStateTimeStamp = GetTimestamp(); _enterStateThroughoutData = new ThroughoutData(); _stateMeasureCount = 0; _tryIncreaseBlinkCount = 0; _tryDecreaseBlinkCount = 0; _tryDecreaseInitialThreadCount = -1; _optimalStateAverageThroughout = -1; _isPerfMeasureThreadWork = false; }