123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using System;
- using System.Collections.Generic;
- using System.Diagnostics;
- using System.Linq;
- using System.Runtime.InteropServices;
- using System.Text;
- using System.Threading;
- namespace Ant.Common
- {
- public static class CodeTimer
- {
- public static void Initialize()
- {
- Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
- Thread.CurrentThread.Priority = ThreadPriority.Highest;
- Time("", 1, () => { });
- }
- public static void Time(string name, int iteration, Action action)
- {
- if (String.IsNullOrEmpty(name)) return;
- // 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("\t花费时间:\t" + watch.ElapsedMilliseconds.ToString("N0") + "ms");
- Console.WriteLine("\tCPU时钟周期:\t" + cpuCycles.ToString("N0"));
- // 5.
- for (int i = 0; i <= GC.MaxGeneration; i++)
- {
- int count = GC.CollectionCount(i) - gcCounts[i];
- Console.WriteLine("\t垃圾收集的回收次数 " + i + ": \t\t" + count);
- }
- Console.WriteLine();
- }
- private static ulong GetCycleCount()
- {
- ulong cycleCount = 0;
- QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);
- 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();
- }
- }
|