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;
}
}
}