/// <summary> /// Merges the children of a program part to make the plot slightly less confusing. /// </summary> /// <param name="part">the program part</param> private static void MergeAndCompress([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part) { //part.Children.Sort((x,y)=> String.Compare(x.Key, y.Key, StringComparison.Ordinal)); for (var i = 0; i < part.Children.Count; i++) { var first = part.Children[i]; for (var j = i + 1; j < part.Children.Count; j++) { if (first.Key == part.Children[j].Key) { //merge //_compressedItems++; var second = part.Children[j]; first.Duration2 += second.Duration2; first.Children.AddRange(second.Children); part.Children.Remove(second); i = -1; break; } } } foreach (var child in part.Children) { MergeAndCompress(child); } }
//convert all durations to double for later adding private static void InitializeDuration2([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part) { part.Duration2 = part.Duration.TotalSeconds; foreach (var child in part.Children) { InitializeDuration2(child); } }
private void InitPartsList([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part) { if (_parts.Contains(part)) { throw new LPGException("Fail! Part already in list"); } _parts.Add(part); foreach (var child in part.Children) { InitPartsList(child); } }
private void AddBars([JetBrains.Annotations.NotNull] CalculationProfiler.ProgramPart part, int row, double offset, int fontsize, [JetBrains.Annotations.NotNull] Dictionary <int, IntervalBarSeries> itemsByLevel, [JetBrains.Annotations.NotNull] OxyPalette palette, [JetBrains.Annotations.NotNull] PlotModel pm) { var runningsum = offset; for (var i = 0; i < part.Children.Count; i++) { var programPart = part.Children[i]; AddBars(programPart, row + 1, runningsum, fontsize, itemsByLevel, palette, pm); runningsum += programPart.Duration2; } //bar var item = new IntervalBarItem(offset, offset + part.Duration2) { Color = palette.Colors[_parts.IndexOf(part)] }; if (!itemsByLevel.ContainsKey(1)) { var series = new IntervalBarSeries { FontSize = fontsize }; itemsByLevel.Add(1, series); } var ibs = new IntervalBarSeries(); for (var i = 0; i < row; i++) { ibs.Items.Add(new IntervalBarItem(0, 0, "")); } ibs.StrokeThickness = 0.1; ibs.Items.Add(item); pm.Series.Add(ibs); // item.Title = name; //annotation if (string.IsNullOrWhiteSpace(part.Key)) { throw new LPGException("Empty profiler key"); } var name = part.Key; if (name.Length > 100) { name = name.Substring(0, 97) + "..."; } var textAnnotation1 = new TextAnnotation { StrokeThickness = 0, FontSize = 6, Padding = new OxyThickness(10, 0, 10, 0) }; var txtValue = name + " - " + part.Duration2.ToString("N1", CultureInfo.InvariantCulture) + "s"; textAnnotation1.Text = txtValue; textAnnotation1.TextHorizontalAlignment = HorizontalAlignment.Left; textAnnotation1.TextPosition = new DataPoint(offset, row + GetOffset(row)); pm.Annotations.Add(textAnnotation1); }