public void Add(PerformanceEventArrivedEventArgs e) { lock (data) { this.data.Add(e); componentNames.Add(e.ComponentName); categoryNames.Add(e.CategoryName); measurements.Add(e.MeasurementName); LazyCleanup(e.Timestamp); } }
internal void WriteXml(string filename, List <PerformanceEventArrivedEventArgs> events) { XmlWriterSettings s = new XmlWriterSettings(); s.Indent = true; using (XmlWriter w = XmlWriter.Create(filename, s)) { long start = 0; w.WriteStartElement("PerformanceData"); if (events.Count > 0) { start = events[0].Timestamp; long end = events[events.Count - 1].Timestamp; w.WriteAttributeString("Duration", (end - start).ToString()); } Dictionary <PerformanceEventArrivedEventArgsKey, PerformanceEventArrivedEventArgs> open = new Dictionary <PerformanceEventArrivedEventArgsKey, PerformanceEventArrivedEventArgs>(); foreach (var e in events) { PerformanceEventArrivedEventArgsKey key = new PerformanceEventArrivedEventArgsKey(e); if (e.EventId == BeginEvent) { open[key] = e; } else if (e.EventId == EndEvent) { w.WriteStartElement("Event"); WriteEventCategory(w, e); w.WriteAttributeString("Timestamp", (e.Timestamp - start).ToString()) ; PerformanceEventArrivedEventArgs begin = null; if (open.TryGetValue(key, out begin)) { long eventDuration = e.Timestamp - begin.Timestamp; w.WriteAttributeString("Duration", eventDuration.ToString()); w.WriteEndElement(); } } else { w.WriteStartElement("Event"); WriteEventCategory(w, e); w.WriteAttributeString("Timestamp", (e.Timestamp - start).ToString()); w.WriteEndElement(); } } w.WriteEndElement(); } }
public PerformanceEventArrivedEventArgsKey(PerformanceEventArrivedEventArgs data) { this.Component = data.ComponentName; this.Category = data.CategoryName; this.Measurement = data.MeasurementName; if (this.Component == null && !string.IsNullOrEmpty(Category)) { string[] parts = Category.Split('.'); if (parts.Length == 2) { this.Component = parts[0]; this.Category = parts[1]; } } }
void PrepareLegend() { Legend.Clear(); legendColors = new Dictionary <PerformanceEventArrivedEventArgsKey, Tuple <int, Color> >(); foreach (BeginEndEvent record in data) { PerformanceEventArrivedEventArgs begin = record.Begin; PerformanceEventArrivedEventArgs e = record.End; Tuple <int, Color> style; PerformanceEventArrivedEventArgsKey key = new PerformanceEventArrivedEventArgsKey(begin); if (!legendColors.TryGetValue(key, out style)) { int i = legendColors.Count; Color color = GetColor(i); legendColors[key] = style = new Tuple <int, Color>(i, color); Legend.AddItem(color, key.Label); } } }
Grid GetPopupContent(int index) { Grid content = null; if (index < data.Count) { PerformanceEventArrivedEventArgs args = data[index]; content = new Grid(); content.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); content.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Auto) }); ulong span = args.Ticks; double seconds = (double)span / (double)PerformanceFrequency; string units = "s"; // seconds; if (seconds.ToString("N").StartsWith("0.0")) { seconds *= 1000; units = "ms"; } if (seconds.ToString("N").StartsWith("0.0")) { seconds *= 1000; units = "μs"; } AddRow(content, "Component", args.ComponentName); AddRow(content, "Category", args.CategoryName); AddRow(content, "Measurement", args.MeasurementName); AddRow(content, "Time", seconds.ToString("N3") + units); } return(content); }
protected override void OnRender(DrawingContext drawingContext) { drawingContext.DrawRectangle(Brushes.White, null, new Rect(new Point(0, 0), this.RenderSize)); gesture.HidePopup(); if (data == null || data.Count == 0) { return; } long span = end - start; // ticks double ticksPerLabel = (zoom * frequency); double scale = pixelsPerLabel / ticksPerLabel; if (ZoomToFit) { //double labels = (int)(this.ActualWidth / pixelsPerLabel); //while (ticksPerLabel * labels > span) //{ // zoom = ZoomIn(zoom); // actualZoom = 1 / (zoom * frequency); // ticksPerLabel = (pixelsPerLabel * actualZoom); //} //while (ticksPerLabel * labels < span) //{ // zoom = ZoomOut(zoom); // actualZoom = 1 / (zoom * frequency); // ticksPerLabel = (pixelsPerLabel * actualZoom); //} } extent = Rect.Empty; double maxy = 0; double maxx = 0; foreach (BeginEndEvent record in data) { PerformanceEventArrivedEventArgs begin = record.Begin; PerformanceEventArrivedEventArgs e = record.End; Brush color = null; PerformanceEventArrivedEventArgsKey key = new PerformanceEventArrivedEventArgsKey(begin); Tuple <int, Color> style = legendColors[key]; color = new SolidColorBrush(style.Item2); double y = 20 + style.Item1 * 22; double x = HorizontalMargin + (double)(begin.Timestamp - start) * (double)scale; double w = (double)(e.Timestamp - begin.Timestamp) * (double)scale; Rect bounds = new Rect(x, y, w, 20); maxy = Math.Max(maxy, y + 20); maxx = Math.Max(maxx, x + w); drawingContext.DrawRectangle(color, new Pen(color, 1), bounds); record.Bounds = bounds; extent = Rect.Union(extent, bounds); } // Draw scale Typeface typeface = new Typeface("Segoe UI"); maxy += 20; Pen pen = new Pen(Brushes.Black, 1); drawingContext.DrawLine(pen, new Point(HorizontalMargin, maxy - 5), new Point(HorizontalMargin, maxy + 5)); drawingContext.DrawLine(pen, new Point(maxx, maxy - 5), new Point(maxx, maxy + 5)); drawingContext.DrawLine(pen, new Point(HorizontalMargin, maxy), new Point(maxx, maxy)); double unit = 0; double unitStep = zoom; // zoom is inverse . string units = "s"; // seconds; if (unitStep.ToString("N").StartsWith("0.0")) { unitStep *= 1000; units = "ms"; } if (unitStep.ToString("N").StartsWith("0.0")) { unitStep *= 1000; units = "μs"; } int digits = GetDigits(zoom); for (double i = 0; i < span; i += ticksPerLabel) { double x = HorizontalMargin + (i * scale); drawingContext.DrawLine(pen, new Point(x, maxy - 5), new Point(x, maxy + 5)); string label = Math.Round(unit, digits, MidpointRounding.ToEven).ToString(); if (i == 0) { label = units; } FormattedText ft = new FormattedText(label, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, typeface, 10, Brushes.Black); drawingContext.DrawText(ft, new Point(x - (ft.Width / 2), maxy + 10)); unit += unitStep; } }
void WriteEventCategory(XmlWriter w, PerformanceEventArrivedEventArgs e) { w.WriteAttributeString("Component", e.ComponentName); w.WriteAttributeString("Category", e.CategoryName); w.WriteAttributeString("Measurement", e.MeasurementName); }
private void CreateWatchers() { Guid providerId = typeof(PerformanceBlock).GUID; watcher = new PerformanceEventTraceWatcher(session); watcher.EventArrived += delegate(object sender, EventArrivedEventArgs e) { if (e.EventException != null) { // Handle the exception Trace.WriteLine(e.EventException); return; } PerformanceEventArrivedEventArgs pe = e as PerformanceEventArrivedEventArgs; if (recording && pe != null) { if (!filter || ((ComponentFilter == null || pe.ComponentName == ComponentFilter) && (CategoryFilter == null || pe.CategoryName == CategoryFilter) && (MeasurementFilter == null || pe.MeasurementName == MeasurementFilter))) { data.Add(pe); count++; changed = true; } } }; wpfWatcher = new WpfEventTraceWatcher(session); wpfWatcher.EventArrived += delegate(object sender, EventArrivedEventArgs e) { if (e.EventException != null) { // Handle the exception Trace.WriteLine(e.EventException); return; } WpfEventArrivedEventArgs we = e as WpfEventArrivedEventArgs; // find the WPF render events if (recording && we != null && we.Event != null) { WpfEvent wev = we.Event; if (!filter || ((ComponentFilter == null || ComponentId.WPF.ToString() == ComponentFilter) && (CategoryFilter == null || CategoryId.View.ToString() == CategoryFilter) && (MeasurementFilter == null || wev.Task == MeasurementFilter))) { data.Add(new PerformanceEventArrivedEventArgs() { EventId = we.EventId, EventName = we.EventName, ProviderId = we.ProviderId, Timestamp = we.Timestamp, Category = CategoryId.View, Component = ComponentId.WPF, MeasurementName = wev.Task }); count++; changed = true; } } }; measurementWatcher = new MeasurementBlockEventTraceWatcher(session); measurementWatcher.EventArrived += delegate(object sender, EventArrivedEventArgs e) { if (e.EventException != null) { // Handle the exception Trace.WriteLine(e.EventException); return; } MeasurementBlockEventArgs me = e as MeasurementBlockEventArgs; if (recording && me != null) { if (!filter || (CategoryFilter == null || me.Category == CategoryFilter)) { string cat = me.Category; string comp = null; int i = cat.IndexOf(':'); if (i > 0) { comp = cat.Substring(0, i); cat = cat.Substring(i + 1).Trim(); } data.Add(new PerformanceEventArrivedEventArgs() { EventId = me.EventId, // fortunately the event id's are the same. EventName = me.EventName, ProviderId = me.ProviderId, Timestamp = me.Timestamp, CategoryName = cat, ComponentName = comp, Size = me.Size, Ticks = me.Ticks }); count++; changed = true; } } }; // start timer so we can update graph when events arrive. if (timer == null) { timer = new DispatcherTimer(TimeSpan.FromSeconds(1), DispatcherPriority.Background, new EventHandler(OnTick), this.Dispatcher); timer.Start(); } }