Beispiel #1
0
            /// <summary>
            /// Task routine.
            /// </summary>
            public void Run()
            {
                try
                {
                    _benchmark.OnThreadReady();

                    _benchmark.PrintDebug("Worker thread ready.");

                    while (!_benchmark._start)
                    {
                        Thread.Sleep(10);
                    }

                    _benchmark.PrintDebug("Worker thread started benchmark execution.");

                    var warmupIteration = true;

                    long maxDur = 0;

                    long maxOps = _benchmark.Operations;

                    while (!_benchmark._stop)
                    {
                        if (warmupIteration && !_benchmark._warmup)
                        {
                            warmupIteration = false;

                            _benchmark.OnWarmupFinished();

                            _state.StopWarmup();

                            _benchmark._barrier.SignalAndWait();
                        }

                        if (!warmupIteration)
                        {
                            if (maxOps > 0 && Interlocked.Read(ref _benchmark._curOps) > maxOps)
                            {
                                break;
                            }
                        }

                        var desc = _descs.Length == 1
                            ? _descs[0]
                            : _descs[BenchmarkUtils.GetRandomInt(_descs.Length)];

                        var res = true;

                        _benchmark.OnBatchStarted(_state);

                        _watch.Start();

                        try
                        {
                            for (var i = 0; i < _benchmark.BatchSize; i++)
                            {
                                desc.Operation(_state);

                                _state.IncrementCounter();
                            }

                            if (!warmupIteration)
                            {
                                Interlocked.Add(ref _benchmark._curOps, _benchmark.BatchSize);
                            }
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("Exception: " + e);

                            res = false;

                            if (_benchmark.MaxErrors > 0 &&
                                Interlocked.Increment(ref _benchmark._errorCount) > _benchmark.MaxErrors)
                            {
                                lock (_benchmark)
                                {
                                    Console.WriteLine("Benchmark is stopped due to too much errors: " +
                                                      _benchmark.MaxErrors);

                                    Environment.Exit(-1);
                                }
                            }
                        }
                        finally
                        {
                            _watch.Stop();

                            var curDur = _watch.ElapsedTicks;

                            if (res)
                            {
                                res = _benchmark.OnBatchFinished(_state, curDur);
                            }

                            _state.Reset();

                            if (curDur > maxDur)
                            {
                                maxDur = curDur;

                                _benchmark.PrintDebug("The longest execution [warmup=" + warmupIteration +
                                                      ", dur(nsec)=" + maxDur * 1000000000 / Stopwatch.Frequency + ']');
                            }

                            _watch.Reset();

                            if (!warmupIteration && res)
                            {
                                _results[desc.Name].Add(curDur);
                            }
                        }
                    }
                }
                finally
                {
                    _benchmark.PrintDebug("Worker thread stopped.");

                    _benchmark.OnThreadFinished();
                }
            }