public static TimingMeter GetMeter(string title, string category, bool accumulate) { TimingMeter meter = GetMeter(title, category); meter.accumulate = true; return(meter); }
// 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); } }
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); }
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)); } }
// 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); } }
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); } }
public AutoTimer(TimingMeter meter) { this.meter = meter; meter.Enter(); }
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; }
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(); }
public void Dispose() { meter.Exit(); meter = null; }
// 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; } }
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); } } }