Axiom.Core.MeterManager.GenerateReport C# (CSharp) Method

GenerateReport() protected method

protected GenerateReport ( StreamWriter writer, int start, string>.Dictionary options ) : void
writer System.IO.StreamWriter
start int
options string>.Dictionary
return void
		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 ( 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 < eventTrace.Count; i++ )
			{
				short kind = eventTrace[ i ].eventKind;
				long t = 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 ", " ",
												   eventTrace[ i ].info ) );
					continue;
				}
				TimingMeter meter = GetMeterById( 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 ( eventTrace.Count > i + 1 && eventTrace[ i + 1 ].meterId == eventTrace[ i ].meterId &&
							eventTrace[ i + 1 ].eventKind == ekExit &&
							ToMicroseconds( 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 );
				}
			}
		}

Usage Example

Example #1
0
        public static void Report(string title, StreamWriter writer, int start, string optionsString)
        {
            bool opened = false;

            if (writer == null)
            {
                var f = new FileStream(MeterLogFilename, (File.Exists(MeterLogFilename) ? FileMode.Append : FileMode.Create), FileAccess.Write);
                writer = new StreamWriter(f);
                writer.Write(string.Format("\r\nStarting meter report on {0} at {1} for {2}; units are usecs.", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), title));
                opened = true;
            }
            instance.GenerateReport(writer, start, null);
            if (opened)
            {
                writer.Close();
            }
        }