// // This routine is a sample of what a performance and capacity planning trace // provider will do to generate ETW traces. // static void PerfTracingSample(int eventCount, int argCount, bool bString) { uint i; uint Status; Int64 AvgTime; int arg1 = 3276; int arg2 = 56797; Guid TransactionGuid = new Guid("{b4955bf0-3af1-4740-b475-99055d3fe9aa}"); Console.WriteLine("Perf Tracing Sample running"); TimerTest MyTimer = new TimerTest(); WinTraceProvider MyProvider = new WinTraceProvider(new Guid("{98bea4af-ef37-424a-b457-9ea1cfd77dd9}")); MyTimer.Start(); for (i = 0; i < eventCount; i++) { if (MyProvider.enabled) { if (!bString) { switch (argCount) { case 0: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start); break; case 1: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1); break; case 2: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2); break; case 3: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1); break; case 4: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2); break; case 5: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1); break; case 6: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2); break; case 7: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2, arg1); break; case 8: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, arg1, arg2, arg1, arg2, arg1, arg2, arg1, arg1); break; } } else { switch (argCount) { case 0: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start); break; case 1: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012"); break; case 2: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 3: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 4: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 5: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 6: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 7: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; case 8: Status = MyProvider.TraceEvent(TransactionGuid, EventType.Start, "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012", "12345678901234567890123456789012"); break; } } } } MyTimer.Stop(); AvgTime = MyTimer.Average() / eventCount; Console.WriteLine("Start {0} End {1} Count {2} Delta {3} Freq {4}", MyTimer.m_Start, MyTimer.m_End, MyTimer.m_Count, MyTimer.m_Sum, MyTimer.m_Freq); AvgTime = MyTimer.m_Sum / MyTimer.m_Freq; // This is in seconds Console.WriteLine("Elapsed Time {0} milli seconds ", AvgTime * 1000); // Assumes you are running on a 1700 MHz box. AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount); AvgTime = AvgTime / MyTimer.m_Freq; Console.WriteLine("Done! Average Time for {0} calls = {1} Cycles", eventCount, AvgTime); }
// // Here's what a debug trace provider will have to do to generate debug traces // static void DebugTracingSample(int eventCount, int argCount, bool bString) { uint i; int EventCount = eventCount; uint Status; long AvgTime; unsafe { /* Test to determine how characters are encoded in the String class */ sbyte[] b = { 0x64, 0x65, 0x66, 0x67 }; fixed(sbyte *sbyteArray = b) { String s = new String(sbyteArray, 0, 4); Console.WriteLine("Test String = " + s + " Length = " + s.Length); int len = s.Length * 2; fixed(char *cArray = s.ToCharArray()) { byte *bArray = (byte *)cArray; for (int h = 0; h < len; h++) { Console.WriteLine("[{0}]:{1}", h, bArray[h]); } } } } Console.WriteLine("DebugTracing Sample Running"); unsafe { Console.WriteLine("sizeof char = " + sizeof(char)); } TimerTest MyTimer = new TimerTest(); WinTraceProvider MyProvider = new WinTraceProvider(new Guid("{98bea4af-ef37-424a-b457-9ea1cfd77dd9}")); /*** scratch work - start ***/ Assembly assembly; assembly = Assembly.GetAssembly(MyTimer.GetType()); Console.WriteLine("Code base : " + assembly.CodeBase); /*** scratch work - end ***/ string frmtstr = "Hello {0}"; string frmtstr2 = "Arg0 = {0} Arg1 = {1}"; string frmtstr3 = "Arg0 ={0} Arg1 = {1} Arg2 = {2}"; bool bool_v = false; byte byte_v = (byte)99; sbyte sbyte_v = (sbyte)-114; short short_v = (short)-54; ushort ushort_v = (ushort)5000; int int_v = -654; uint uint_v = (uint)12345; long long_v = (long)-98765; ulong ulong_v = (ulong)1234567; string string_v = "Does it work [2]?"; char char_v = 'G'; decimal decimal_v = (decimal)200.876543243213D; object decimal_obj = decimal_v; double double_v = (double)3.00; float float_v = 2.00F; //This is a string of length 128 bytes string testStr = "We began in earnest on Microsoft Windows 2000 in August 1996!!!!"; //string testStr = "12345678"; //16 bytes in length //Yes, it is only a performance test and hence we do not need the actual formatting. Yet.... string testFmtStr1 = "Test Message = {0}", testFmtStr2 = testFmtStr1 + ",{1}", testFmtStr3 = testFmtStr2 + ",{2}"; string testFmtStr4 = testFmtStr3 + ",{3}", testFmtStr5 = testFmtStr4 + ",{4}", testFmtStr6 = testFmtStr5 + ",{5}"; string testFmtStr7 = testFmtStr6 + ",{6}", testFmtStr8 = testFmtStr7 + ",{7}"; Console.WriteLine("Length = " + testStr.Length); string emptyString = ""; Console.WriteLine("Length of empty string = " + emptyString.Length); //Console.WriteLine(String.Format("Dummy Format {0} {1}","Hello")); unsafe { Console.WriteLine("size of decimal = " + sizeof(decimal)); } Console.WriteLine("Length of decimal string = " + decimal_obj.ToString().Length); if (bString) { //Gather performance results for logging a message containing 1 128-byte argument. Console.WriteLine("Helooooo {0} {1} {2}", decimal_v, (object)null, decimal_v); //MyProvider.DoTraceMessage(1,"Helloooo {0} {1} {2}",decimal_v,(object)null,decimal_v); MyTimer.Start(); for (i = 0; i < eventCount; i++) { if (MyProvider.enabled) { switch (argCount) { case 1: MyProvider.DoTraceMessage(1, testFmtStr1, testStr); break; case 2: MyProvider.DoTraceMessage(1, testFmtStr2, testStr, testStr); break; case 3: MyProvider.DoTraceMessage(1, testFmtStr3, testStr, testStr, testStr); break; case 4: MyProvider.DoTraceMessage(1, testFmtStr4, testStr, testStr, testStr, testStr); break; case 5: MyProvider.DoTraceMessage(1, testFmtStr5, testStr, testStr, testStr, testStr, testStr); break; case 6: MyProvider.DoTraceMessage(1, testFmtStr6, testStr, testStr, testStr, testStr, testStr, testStr); break; case 7: MyProvider.DoTraceMessage(1, testFmtStr7, testStr, testStr, testStr, testStr, testStr, testStr, testStr); break; case 8: MyProvider.DoTraceMessage(1, testFmtStr8, testStr, testStr, testStr, testStr, testStr, testStr, testStr, testStr); break; } } } MyTimer.Stop(); } else { MyTimer.Start(); MyProvider.DoTraceMessage(1, frmtstr, bool_v); MyProvider.DoTraceMessage(1, frmtstr, byte_v); MyProvider.DoTraceMessage(1, frmtstr, sbyte_v); MyProvider.DoTraceMessage(1, frmtstr, short_v); MyProvider.DoTraceMessage(1, frmtstr, ushort_v); MyProvider.DoTraceMessage(1, frmtstr, int_v); MyProvider.DoTraceMessage(1, frmtstr, uint_v); MyProvider.DoTraceMessage(1, frmtstr, long_v); MyProvider.DoTraceMessage(1, frmtstr, ulong_v); MyProvider.DoTraceMessage(1, frmtstr, float_v); MyProvider.DoTraceMessage(1, frmtstr, double_v); MyProvider.DoTraceMessage(1, frmtstr, decimal_v); MyProvider.DoTraceMessage(1, frmtstr, char_v); MyProvider.DoTraceMessage(1, frmtstr, string_v); MyProvider.DoTraceMessage(1, frmtstr2, uint_v, byte_v); Status = MyProvider.DoTraceMessage(1, frmtstr3, decimal_v, float_v, long_v); /* * for (i=0; i < eventCount; i++) * { * if (MyProvider.enabled) * { * for(i=0; i < eventCount; i++) * { * if (MyProvider.enabled) * { * switch(argCount) * { * case 1:MyProvider.DoTraceMessage(1,testFmtStr1,decimal_v);break; * case 2:MyProvider.DoTraceMessage(1,testFmtStr2,decimal_v,decimal_v);break; * case 3:MyProvider.DoTraceMessage(1,testFmtStr3,decimal_v,decimal_v,decimal_v);break; * case 4:MyProvider.DoTraceMessage(1,testFmtStr4,decimal_v,decimal_v,decimal_v,decimal_v);break; * case 5:MyProvider.DoTraceMessage(1,testFmtStr5,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v);break; * case 6:MyProvider.DoTraceMessage(1,testFmtStr6,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v);break; * case 7:MyProvider.DoTraceMessage(1,testFmtStr7,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v, decimal_v);break; * case 8:MyProvider.DoTraceMessage(1,testFmtStr8,decimal_v,decimal_v,decimal_v,decimal_v, decimal_v, decimal_v, decimal_v, decimal_v);break; * } * } * } * * * * } * } */ MyTimer.Stop(); /* * * AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount); * AvgTime = AvgTime / MyTimer.m_Freq; * Console.WriteLine("Encoding Scheme [{2} args] : Average Time for {0} calls = {1} Cycles", eventCount, AvgTime, argCount); * * MyTimer.Clear(); * MyTimer.Start(); * for (i=0; i < eventCount; i++) * { * if (MyProvider.enabled) * { * for(i=0; i < eventCount; i++) * { * if (MyProvider.enabled) * { * switch(argCount) * { * case 1:MyProvider.DoTraceMessage(1,testFmtStr1,((object)decimal_v).ToString());break; * case 2:MyProvider.DoTraceMessage(1,testFmtStr2,((object)decimal_v).ToString(),((object)decimal_v).ToString());break; * case 3:MyProvider.DoTraceMessage(1,testFmtStr3,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString());break; * case 4:MyProvider.DoTraceMessage(1,testFmtStr4,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString());break; * case 5:MyProvider.DoTraceMessage(1,testFmtStr5,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString());break; * case 6:MyProvider.DoTraceMessage(1,testFmtStr6,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break; * case 7:MyProvider.DoTraceMessage(1,testFmtStr7,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break; * case 8:MyProvider.DoTraceMessage(1,testFmtStr8,((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(),((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString(), ((object)decimal_v).ToString());break; * } * } * } * * } * } * * MyTimer.Stop(); * * * * * AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount); * AvgTime = AvgTime / MyTimer.m_Freq; * Console.WriteLine("ToString() Scheme [{2} args] : Average Time for {0} calls = {1} Cycles", eventCount, AvgTime, argCount); */ } Console.WriteLine("Debug Test Complete. Timing Results:"); AvgTime = MyTimer.Average() / eventCount; Console.WriteLine("StartTime {0} EndTime {1} Count {2} Sum {3} Freq {4}", MyTimer.m_Start, MyTimer.m_End, eventCount, MyTimer.m_Sum, MyTimer.m_Freq); AvgTime = MyTimer.m_Sum / MyTimer.m_Freq; // This is in seconds AvgTime = MyTimer.m_Sum * (1700 * 1000000 / eventCount); AvgTime = AvgTime / MyTimer.m_Freq; Console.WriteLine("Done! Average Time for {0} calls = {1} Cycles", eventCount, AvgTime); }