Mega Code Archive

 
Categories / C# / Development Class
 

TestPerformance cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Diagnostics; using System.Runtime.InteropServices; namespace Utility {   public static  class TestPerformance   {     public static void PrepareForOperation()     {       GC.Collect();       GC.WaitForPendingFinalizers();       GC.Collect();       Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;       Time( "", 1, () => { } );     }     public static void Time( string name, int iteration, Action action )     {       if ( name.Length == 0 ) return;       //??GC???????????????????       GC.Collect( GC.MaxGeneration, GCCollectionMode.Forced );       int[] gcCounts = new int[GC.MaxGeneration + 1];       for ( int i = 0; i <= GC.MaxGeneration; i++ )       {         gcCounts[i] = GC.CollectionCount( i );       }       ConsoleColor currentForeColor = Console.ForegroundColor;       Console.ForegroundColor = ConsoleColor.Yellow;       Console.WriteLine( name );       //??????????????CPU????1?       Stopwatch watch = new Stopwatch();       long cyclesTimes = GetCurrentThreadTimes();       long start = Process.GetCurrentProcess().TotalProcessorTime.Ticks;       watch.Start();       for ( int i = 0; i < iteration; i++ ) action();       watch.Stop();       long cpuCycles = GetCurrentThreadTimes() - cyclesTimes;       long end = Process.GetCurrentProcess().TotalProcessorTime.Ticks;       Console.ForegroundColor = currentForeColor;       Console.WriteLine( "\tTime Elapsed:\t" +         watch.ElapsedTicks / (double)Stopwatch.Frequency + "s" + "avg :" + (watch.ElapsedTicks / (double)Stopwatch.Frequency/iteration).ToString("F10")               );       Console.WriteLine( "\tCPU Cycles:\t" + cpuCycles.ToString( "N0" ) );       for ( int i = 0; i <= GC.MaxGeneration; i++ )       {         int count = GC.CollectionCount( i ) - gcCounts[i];         Console.WriteLine( "\tGen " + i + ": \t\t" + count );       }       Console.WriteLine();       Console.ReadLine();       }     [DllImport( "kernel32.dll", SetLastError = true )]     static extern bool GetThreadTimes( IntPtr hThread, out long lpCreationTime,        out long lpExitTime, out long lpKernelTime, out long lpUserTime );     [DllImport( "kernel32.dll" )]     static extern IntPtr GetCurrentThread();     static long GetCurrentThreadTimes()     {       long l;       long kernelTime, userTimer;       GetThreadTimes( GetCurrentThread(), out l, out l, out kernelTime, out userTimer );       return kernelTime + userTimer;     }   }      }