示例#1
0
        public static TimingMeter GetMeter(string title, string category, bool accumulate)
        {
            TimingMeter meter = GetMeter(title, category);

            meter.accumulate = true;
            return(meter);
        }
示例#2
0
 // Enable or disable only a single category
 public static void EnableOnlyCategory(string categoryName, bool enable)
 {
     Init();
     foreach (KeyValuePair <int, TimingMeter> pair in instance.metersById)
     {
         TimingMeter meter = pair.Value;
         meter.enabled = (meter.category == categoryName ? enable : !enable);
     }
 }
示例#3
0
        public static int AddEvent(TimingMeter meter, short eventKind, string info)
        {
            long       time       = CaptureCurrentTime();
            short      meterId    = (meter == null) ? (short)0 : meter.meterId;
            MeterEvent meterEvent = new MeterEvent(meterId, eventKind, time, info);

#if DEBUG
//            DebugAddEvent(meter, meterEvent);
#endif
            instance.eventTrace.Add(meterEvent);
            return(instance.eventTrace.Count);
        }
示例#4
0
        protected void SaveToFileInternal(string pathname)
        {
            FileStream   f      = new FileStream(pathname, FileMode.Create, FileAccess.Write);
            StreamWriter writer = new StreamWriter(f);

            writer.Write(string.Format("MeterCount={0}\n", metersById.Count));
            foreach (KeyValuePair <int, TimingMeter> pair in instance.metersById)
            {
                TimingMeter meter = pair.Value;
                writer.Write(string.Format("{0},{1},{2}\n", meter.title, meter.category, meter.meterId));
            }
        }
示例#5
0
        // Look up the timing meter by title; if it doesn't exist
        // create one with the title and category
        public static TimingMeter GetMeter(string title, string category)
        {
            string      name = title + "&" + category;
            TimingMeter meter;

            Init();
            if (instance.metersByName.TryGetValue(name, out meter))
            {
                return(meter);
            }
            else
            {
                BarfOnBadChars(title, "TimingMeter title");
                BarfOnBadChars(category, "TimingMeter category");
                short id = instance.timerIdCounter++;
                meter = new TimingMeter(title, category, id);
                instance.metersByName.Add(name, meter);
                instance.metersById.Add(id, meter);
                return(meter);
            }
        }
示例#6
0
 private static void DebugAddEvent(TimingMeter meter, MeterEvent evt)
 {
     if (evt.eventKind == ekEnter)
     {
         debugMeterStack.Add(new MeterStackEntry(meter, 0, debugMeterStack.Count));
     }
     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);
     }
 }
示例#7
0
 public AutoTimer(TimingMeter meter)
 {
     this.meter = meter;
     meter.Enter();
 }
示例#8
0
 internal MeterStackEntry(TimingMeter meter, long eventTime, int eventNumber)
 {
     this.meter       = meter;
     this.eventTime   = eventTime;
     this.eventNumber = eventNumber;
 }
 public static int AddEvent(TimingMeter meter, short eventKind, string info)
 {
     long time = CaptureCurrentTime();
     short meterId = (meter == null) ? (short)0 : meter.meterId;
     MeterEvent meterEvent = new MeterEvent(meterId, eventKind, time, info);
     #if DEBUG
     //            DebugAddEvent(meter, meterEvent);
     #endif
     instance.eventTrace.Add(meterEvent);
     return instance.eventTrace.Count;
 }
示例#10
0
        protected void DumpEventLog(List <MeterEvent> events)
        {
            if (MeterEventsFile == null)
            {
                // Can't do anything
                return;
            }
            if (File.Exists(MeterEventsFile))
            {
                File.Delete(MeterEventsFile);
            }
            FileStream   f      = new FileStream(MeterEventsFile, FileMode.Create, FileAccess.Write);
            StreamWriter writer = new StreamWriter(f);

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

            for (int i = 0; i < events.Count; i++)
            {
                short kind = events[i].eventKind;
                long  t    = events[i].eventTime;
                if (i == 0)
                {
                    firstEventTime = t;
                }
                if (kind == ekInfo)
                {
                    writer.WriteLine(string.Format("{0,12:D}         {1}{2} {3}{4}",
                                                   ToMicroseconds(t - firstEventTime, i),
                                                   IndentCount(indent + 1), "Info ", " ",
                                                   events[i].info));
                    continue;
                }
                TimingMeter meter = GetMeterById(events[i].meterId);
                if (kind == ekEnter)
                {
                    indent++;
                    writer.WriteLine(string.Format("{0,12:D}         {1}{2} {3}.{4}",
                                                   ToMicroseconds(t - firstEventTime, i),
                                                   IndentCount(indent),
                                                   "Enter",
                                                   meter.category, meter.title));
                    meterStack.Add(new MeterStackEntry(meter, t, i));
                }
                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,7:D} {2}{3} {4}.{5}",
                                                   ToMicroseconds(t - firstEventTime, i),
                                                   ToMicroseconds(t - s.eventTime, i - s.eventNumber),
                                                   IndentCount(indent),
                                                   "Exit ",
                                                   meter.category, meter.title));
                    indent--;
                    meterStack.RemoveAt(meterStack.Count - 1);
                }
            }
            writer.Close();
        }
示例#11
0
 internal MeterStackEntry(TimingMeter meter, long eventTime, int eventNumber)
 {
     this.meter = meter;
     this.eventTime = eventTime;
     this.eventNumber = eventNumber;
 }
示例#12
0
 private static void DebugAddEvent(TimingMeter meter, MeterEvent evt)
 {
     if (evt.eventKind == ekEnter) {
         debugMeterStack.Add(new MeterStackEntry(meter, 0, debugMeterStack.Count));
     } 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);
     }
 }
示例#13
0
 public void Dispose()
 {
     meter.Exit();
     meter = null;
 }
示例#14
0
 // Look up the timing meter by title; if it doesn't exist
 // create one with the title and category
 public static TimingMeter GetMeter(string title, string category)
 {
     string name = title + "&" + category;
     TimingMeter meter;
     Init();
     if (instance.metersByName.TryGetValue(name, out meter))
         return meter;
     else {
         BarfOnBadChars(title, "TimingMeter title");
         BarfOnBadChars(category, "TimingMeter category");
         short id = instance.timerIdCounter++;
         meter = new TimingMeter(title, category, id);
         instance.metersByName.Add(name, meter);
         instance.metersById.Add(id, meter);
         return meter;
     }
 }
示例#15
0
 public void Dispose()
 {
     meter.Exit();
     meter = null;
 }
示例#16
0
        protected void GenerateReport(StreamWriter writer, List <MeterEvent> events, int start, Dictionary <string, string> options)
        {
            // For now, ignore options and just print the events
            if (dumpEventLog)
            {
                DumpEventLog(events);
            }

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

            for (int i = 0; i < events.Count; i++)
            {
                short kind = events[i].eventKind;
                long  t    = events[i].eventTime;
                if (i == 0)
                {
                    firstEventTime = t;
                }
                if (kind == ekInfo)
                {
                    writer.WriteLine(string.Format("{0,12:D}         {1}{2} {3}{4}",
                                                   ToMicroseconds(t - firstEventTime, i),
                                                   IndentCount(indent + 1), "Info ", " ",
                                                   events[i].info));
                    continue;
                }
                TimingMeter meter = GetMeterById(events[i].meterId);
                if (kind == ekEnter)
                {
                    if (meter.accumulate && meter.stackDepth == 0)
                    {
                        meter.addedTime = 0;
                    }
                    if (i >= start && (!meter.accumulate || meter.stackDepth == 0))
                    {
                        if (!meter.accumulate)
                        {
                            indent++;
                        }
                        writer.WriteLine(string.Format("{0,12:D}         {1}{2}{3}{4}.{5}",
                                                       ToMicroseconds(t - firstEventTime, i),
                                                       IndentCount(indent), "Enter",
                                                       (meter.accumulate ? "*" : " "),
                                                       meter.category, meter.title));
                    }
                    meter.stackDepth++;
                    meterStack.Add(new MeterStackEntry(meter, t, i));
                }
                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)
                    {
                        writer.WriteLine(string.Format("{0,12:D} {1,7:D} {2}{3}{4}{5}.{6}",
                                                       ToMicroseconds(t - firstEventTime, i),
                                                       ToMicroseconds(meter.accumulate ? meter.addedTime : t - s.eventTime, i - s.eventNumber),
                                                       IndentCount(indent), "Exit ",
                                                       (meter.accumulate ? "*" : " "),
                                                       meter.category, meter.title));
                        if (!meter.accumulate)
                        {
                            indent--;
                        }
                    }
                    meterStack.RemoveAt(meterStack.Count - 1);
                }
            }
        }
示例#17
0
 public AutoTimer(TimingMeter meter)
 {
     this.meter = meter;
     meter.Enter();
 }