Beispiel #1
0
        protected void DumpEventLog()
        {
            if (File.Exists(MeterEventsFilename))
            {
                File.Delete(MeterEventsFilename);
            }
            var f      = new FileStream(MeterEventsFilename, FileMode.Create, FileAccess.Write);
            var writer = new StreamWriter(f);

            writer.Write(string.Format("Dumping meter event log on {0} at {1}; units are usecs\r\n", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString()));
            int  indent         = 0;
            var  meterStack     = new List <MeterStackEntry>();
            long firstEventTime = 0;

            for (int i = 0; i < this.eventTrace.Count; i++)
            {
                short kind = this.eventTrace[i].eventKind;
                long  t    = this.eventTrace[i].eventTime;
                if (i == 0)
                {
                    firstEventTime = t;
                }
                if (kind == ekInfo)
                {
                    writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}{4}", ToMicroseconds(t - firstEventTime), IndentCount(indent), "Info ", " ", this.eventTrace[i].info));
                    continue;
                }
                TimingMeter meter = GetMeterById(this.eventTrace[i].meterId);
                if (kind == ekEnter)
                {
                    indent++;
                    writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}.{4}", ToMicroseconds(t - firstEventTime), IndentCount(indent), "Enter", meter.category, meter.title));
                    meterStack.Add(new MeterStackEntry(meter, t));
                }
                else if (kind == ekExit)
                {
                    Debug.Assert(meterStack.Count > 0, "Meter stack is empty during ekExit");
                    MeterStackEntry s = meterStack[meterStack.Count - 1];
                    Debug.Assert(s.meter == meter, "Entered " + s.meter.title + "; Exiting " + meter.title);
                    writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}.{4}", ToMicroseconds(t - s.eventTime), IndentCount(indent), "Exit ", meter.category, meter.title));
                    indent--;
                    meterStack.RemoveAt(meterStack.Count - 1);
                }
            }
            writer.Close();
        }
Beispiel #2
0
 private static void DebugAddEvent(TimingMeter meter, MeterEvent evt)
 {
     if (evt.eventKind == ekEnter)
     {
         debugMeterStack.Add(new MeterStackEntry(meter, 0));
     }
     else if (evt.eventKind == ekExit)
     {
         Debug.Assert(debugMeterStack.Count > 0, "Meter stack is empty during ekExit");
         MeterStackEntry s = debugMeterStack[debugMeterStack.Count - 1];
         Debug.Assert(s.meter == meter, "Entered " + s.meter.title + "; Exiting " + meter.title);
         debugMeterStack.RemoveAt(debugMeterStack.Count - 1);
     }
     else if (evt.eventKind == ekInfo)
     {
         // just ignore these
     }
     else
     {
         Debug.Assert(false);
     }
 }
Beispiel #3
0
        protected void GenerateReport(StreamWriter writer, int start, Dictionary <string, string> options)
        {
            // For now, ignore options and just print the event trace
            if (dumpEventLog)
            {
                DumpEventLog();
            }

            // Zero the stack depth and added time
            foreach (var pair in instance.metersById)
            {
                TimingMeter meter = pair.Value;
                meter.stackDepth = 0;
                meter.addedTime  = 0;
            }
            var  meterStack     = new List <MeterStackEntry>();
            int  indent         = 0;
            long firstEventTime = 0;

            for (int i = 0; i < this.eventTrace.Count; i++)
            {
                short kind = this.eventTrace[i].eventKind;
                long  t    = this.eventTrace[i].eventTime;
                if (i == 0)
                {
                    firstEventTime = t;
                }
                if (kind == ekInfo)
                {
                    writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}{4}", ToMicroseconds(t - firstEventTime), IndentCount(indent), "Info ", " ", this.eventTrace[i].info));
                    continue;
                }
                TimingMeter meter = GetMeterById(this.eventTrace[i].meterId);
                if (kind == ekEnter)
                {
                    if (meter.accumulate && meter.stackDepth == 0)
                    {
                        meter.addedTime = 0;
                    }
                    if (i >= start && (!meter.accumulate || meter.stackDepth == 0))
                    {
                        // Don't display the enter and exit if the
                        // exit is the very next record, and the
                        // elapsed usecs is less than DontDisplayUsecs
                        if (this.eventTrace.Count > i + 1 && this.eventTrace[i + 1].meterId == this.eventTrace[i].meterId && this.eventTrace[i + 1].eventKind == ekExit && ToMicroseconds(this.eventTrace[i + 1].eventTime - t) < DontDisplayUsecs)
                        {
                            i++;
                            continue;
                        }
                        writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}{4}.{5}", ToMicroseconds(t - firstEventTime), IndentCount(indent), "Enter", (meter.accumulate ? "*" : " "), meter.category, meter.title));
                        if (!meter.accumulate)
                        {
                            indent++;
                        }
                    }
                    meter.stackDepth++;
                    meterStack.Add(new MeterStackEntry(meter, t));
                }
                else if (kind == ekExit)
                {
                    Debug.Assert(meterStack.Count > 0, "Meter stack is empty during ekExit");
                    MeterStackEntry s = meterStack[meterStack.Count - 1];
                    meter.stackDepth--;
                    Debug.Assert(s.meter == meter);
                    if (meter.stackDepth > 0 && meter.accumulate)
                    {
                        meter.addedTime += t - s.eventTime;
                    }
                    else if (i >= start)
                    {
                        if (!meter.accumulate)
                        {
                            indent--;
                        }
                        writer.WriteLine(string.Format("{0,12:D} {1}{2} {3}{4}.{5}", ToMicroseconds(meter.accumulate ? meter.addedTime : t - s.eventTime), IndentCount(indent), "Exit ", (meter.accumulate ? "*" : " "), meter.category, meter.title));
                    }
                    meterStack.RemoveAt(meterStack.Count - 1);
                }
            }
        }