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); }
/// <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 }