TestPerformance.cs : Garbage Collection « Development Class « C# / C Sharp






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



    
}

   
    
    
    
    
    
    
    
  








Related examples in the same category

1.If object array is still alive
2.Check the Generation for an object array
3.Estimated bytes on heap
4.MaxGeneration is zero based.
5.Get Total Memory
6.demonstrates forced garbage collection 1demonstrates forced garbage collection 1
7.System.IDisposable interface and ensure fastest cleaning up as possible after an objectSystem.IDisposable interface and ensure fastest cleaning up as possible after an object
8.Demonstrates forced garbage collectionDemonstrates forced garbage collection
9.IDisposable interface
10.Print out how many times a generation has been swept.
11.Finalizable Disposable Class with using
12.GCCollectionMode.Optimized
13.GC Class Controls garbage collector
14.GC.Collect Forces an immediate garbage collection
15.Forces a garbage collection from generation zero through a specified generation
16.Forces an immediate garbage collection of all generations.
17.Returns the current generation number of the specified object.
18.Returns the current generation number of the target of a weak reference.
19.GC.GetTotalMemory
20.Gets the maximum number of generations that the system currently supports.
21.Specifies the behavior for a forced garbage collection.