| 
 public static class CodeTimer 
    { 
        private static bool isQueryThreadCycleTime = false; 
        public static void Initialize() 
        { 
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; 
            Thread.CurrentThread.Priority = ThreadPriority.Highest; 
            if (Environment.OSVersion.Platform == PlatformID.Win32NT && Environment.OSVersion.Version.Major >= 6) 
            { 
                isQueryThreadCycleTime = true; 
            } 
            Time("", 1, () => { }); 
        } 
        public static void Time(string name, int iteration, Action action) 
        { 
            if (String.IsNullOrEmpty(name)) return; 
            // warm up 
            action(); 
            // 1. 
            ConsoleColor currentForeColor = Console.ForegroundColor; 
            Console.ForegroundColor = ConsoleColor.Yellow; 
            Console.WriteLine(name); 
            // 2. 
            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); 
            } 
            // 3. 
            Stopwatch watch = new Stopwatch(); 
            watch.Start(); 
            ulong cycleCount = GetCycleCount(); 
            for (int i = 0; i < iteration; i++) action(); 
            ulong cpuCycles = GetCycleCount() - cycleCount; 
            watch.Stop(); 
            // 4. 
            Console.ForegroundColor = currentForeColor; 
            Console.WriteLine("tTime Elapsed:t" + watch.ElapsedMilliseconds.ToString("N0") + "ms"); 
            Console.WriteLine("tCPU Cycles:t" + cpuCycles.ToString("N0")); 
            // 5. 
            for (int i = 0; i <= GC.MaxGeneration; i++) 
            { 
                int count = GC.CollectionCount(i) - gcCounts[i]; 
                Console.WriteLine("tGen " + i + ": tt" + count); 
            } 
            Console.WriteLine(); 
        } 
        private static ulong GetCycleCount() 
        { 
            ulong cycleCount = 0; 
            if (isQueryThreadCycleTime) 
            { 
                QueryThreadCycleTime(GetCurrentThread(), ref cycleCount); 
            } 
            else 
            { 
                ulong l; 
                ulong kernelTime, userTimer; 
                GetThreadTimes(GetCurrentThread(), out l, out l, out kernelTime, 
                  out userTimer); 
                cycleCount = kernelTime + userTimer; 
            } 
            return cycleCount; 
        } 
        [DllImport("kernel32.dll")] 
        [return: MarshalAs(UnmanagedType.Bool)] 
        static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime); 
        [DllImport("kernel32.dll")] 
        static extern IntPtr GetCurrentThread(); 
        [DllImport("kernel32.dll", SetLastError = true)] 
        static extern bool GetThreadTimes(IntPtr hThread, out ulong lpCreationTime, 
           out ulong lpExitTime, out ulong lpKernelTime, out ulong lpUserTime); 
    } 
 |