程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 我整理了老趙一個小的工具類,測試的小工具類,老趙工具類

我整理了老趙一個小的工具類,測試的小工具類,老趙工具類

編輯:關於.NET

我整理了老趙一個小的工具類,測試的小工具類,老趙工具類


     我整理了老趙的一個測試的工具類,別的沒做改變,只是把類名和方法名改成了我自己比較習慣的名稱而已。

     不多說了,代碼如下:
    

     /// <summary>
    /// 代碼性能測試器
    /// </summary>
    public static class CodePerformanceTester
    {
        /// <summary>
        /// 初始化器,首先它會把當前進程及當前線程的優先級設為最高,這樣便可以相對減少操作系統在調度上造成的干擾。
        /// 然後調用一次Time方法進行“預熱”,讓JIT將IL編譯成本地代碼,讓Time方法盡快“進入狀態”。
        /// 該方法要在測試之前執行。
        /// </summary>
        public static void Initialize()
        {
            Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
            Thread.CurrentThread.Priority = ThreadPriority.Highest;
            Test("", 1, () => { });
        }

        /// <summary>
        /// 性能測試的核心方法,打印出花費時間,消耗的CPU時鐘周期,以及各代垃圾收集的回收次數
        /// </summary>
        /// <param name="name">測試實例的名稱,便於記憶</param>
        /// <param name="iteration">迭代次數</param>
        /// <param name="action">所要執行測試的方法</param>
        public static void Test(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進行收集,並記錄目前各代已經收集的次數。
            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.執行代碼,記錄下消耗的時間及CPU時鐘周期。
            Stopwatch watch = new Stopwatch();
            watch.Start();
            ulong cycleCount = GetCycleCount();
            for (int i = 0; i < iteration; i++) action();
            ulong cpuCycles = GetCycleCount() - cycleCount;
            watch.Stop();

            // 4.恢復控制台默認前景色,並打印出消耗時間及CPU時鐘周期。
            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();
        }

        /// <summary>
        /// 獲取周期次數
        /// </summary>
        /// <returns>返回線程的周期次數</returns>
        private static ulong GetCycleCount()
        {
            ulong cycleCount = 0;
            QueryThreadCycleTime(GetCurrentThread(), ref cycleCount);
            return cycleCount;
        }

        /// <summary>
        /// 獲取線程周期時間
        /// </summary>
        /// <param name="threadHandle">線程句柄</param>
        /// <param name="cycleTime">返回周期時間</param>
        /// <returns>返回布爾值,true表示獲取線程周期實現成功,false表示獲取線程周期時間失敗</returns>
        [DllImport("kernel32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool QueryThreadCycleTime(IntPtr threadHandle, ref ulong cycleTime);

        /// <summary>
        /// 獲取當前線程引用句柄
        /// </summary>
        /// <returns>返回當前線程的引用句柄</returns>
        [DllImport("kernel32.dll")]
        static extern IntPtr GetCurrentThread();
    }

   以上就是完整代碼,拷貝就可以使用,記錄下來,以防忘記。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved