简单性能计数器---老赵版改良

老赵版:http://www.cnblogs.com/JeffreyZhao/archive/2009/03/10/codetimer.html

eaglet版:http://blog.csdn.net/eaglet/article/details/4213550

  通读了下他们的代码,老赵版在win7下是完美的,eaglet版~~~他在自己的续也说了GetThreadTimes获取线程实际运行时间上是有偏差的,我多次测试的确很不稳定。

想来想去也没有什么办法可以改进的。。窝里是win7,公司的电脑是苦逼的xp。。也就是说我不能一个代码两个地方通吃。没办法改良下吧。

随便鄙视还有framework2.0的公司真恶心

 

View Code
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 + ": \t\t" + 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);
    }

转载于:https://www.cnblogs.com/qionghua/archive/2012/07/05/2578618.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值