Esempio n. 1
0
        private static WaterfallStats[] ComputeStats(WorkStats[,] stats, int totalWork)
        {
            var waterfallStats = new WaterfallStats[totalWork];

            for (var workIndex = 0; workIndex < totalWork; workIndex++)
            {
                waterfallStats[workIndex] = new WaterfallStats(double.MaxValue);
            }
            for (var i = 0; i < Environment.ProcessorCount; i++)
            {
                for (var j = 0; j < totalWork; j++)
                {
                    var countj = Interlocked.Read(ref stats[i, j].Count);
                    if (countj <= 0)
                    {
                        continue;
                    }
                    waterfallStats[j].Count         += countj;
                    waterfallStats[j].TotalTimeInMs += Interlocked.Read(ref stats[i, j].TimeTicks);
                    waterfallStats[j].MinTimeMs      = Math.Min(waterfallStats[j].MinTimeMs,
                                                                Interlocked.Read(ref stats[i, j].MinTimeTicks));
                    waterfallStats[j].MaxTimeMs = Math.Max(waterfallStats[j].MaxTimeMs,
                                                           Interlocked.Read(ref stats[i, j].MaxTimeTicks));
                }
            }
            return(waterfallStats);
        }
Esempio n. 2
0
        /// <summary>
        /// Provides stats for a given work item.
        /// </summary>
        /// <param name="position">work identifier</param>
        /// <returns>Performance Statistics</returns>
        protected WaterfallStats WorkStatistics(int position)
        {
#if WATERFALLSTATS_ON
            var waterfallStats = new WaterfallStats(double.MaxValue);
            var localStats     = _stats;
            for (var i = 0; i < Environment.ProcessorCount; i++)
            {
                var countj = Interlocked.Read(ref localStats[i, position].Count);
                if (countj <= 0)
                {
                    continue;
                }
                waterfallStats.Count         += countj;
                waterfallStats.TotalTimeInMs += Interlocked.Read(ref localStats[i, position].TimeTicks);
                waterfallStats.MinTimeMs      = Math.Min(waterfallStats.MinTimeMs,
                                                         Interlocked.Read(ref localStats[i, position].MinTimeTicks));
                waterfallStats.MaxTimeMs = Math.Max(waterfallStats.MaxTimeMs,
                                                    Interlocked.Read(ref localStats[i, position].MaxTimeTicks));
            }
            return(waterfallStats);
#else
            return(default(WaterfallStats));
#endif
        }