Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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();
            }
        }
Beispiel #3
0
        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];
                }
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #6
0
        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;
            }
        }
Beispiel #7
0
 void WriteEventCategory(XmlWriter w, PerformanceEventArrivedEventArgs e)
 {
     w.WriteAttributeString("Component", e.ComponentName);
     w.WriteAttributeString("Category", e.CategoryName);
     w.WriteAttributeString("Measurement", e.MeasurementName);
 }
Beispiel #8
0
        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();
            }
        }