统计代码执行时间,使用Stopwatch和UserProcessorTime的区别

当我们需要统计一段代码的执行时间,首先想到的可能是Stopwatch类。在这里,先暂不使用Stopwatch,自定义一个统计代码执行时间的类,大致需要考虑到:

1、确保统计的是当前进程、当前线程中代码的执行时间。
2、在统计执行过程中,不允许有垃圾回收。即在统计代码执行时间之前,就让GC完成垃圾回收。

举例:统计显示一个数组元素所消耗的时间

    class Program
    {
        static void Main(string[] args)
        {
            int[] arrs = new int[10000];
            BuildArray(arrs);

            CalculateTiming calculateTiming = new CalculateTiming();
            calculateTiming.Start();
            DisplaySomeDigits(arrs);
            calculateTiming.Stop();

            Console.WriteLine("所耗费时间为:" + calculateTiming.Result().TotalMilliseconds + "毫秒");
        }

        //显示数组元素
        static void DisplaySomeDigits(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
        }

        //创建数组
        static void BuildArray(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = i;
            }
        }
    }

    /// <summary>
    /// 计算CPU消耗时间
    /// </summary>
    public class CalculateTiming
    {
        private TimeSpan startTime;
        private TimeSpan duration;

        public CalculateTiming()
        {
            startTime = new TimeSpan(0);
            duration = new TimeSpan(0);
        }

        public void Start()
        {
            //手动执行垃圾回收
            GC.Collect();

            //挂起当前线程,直到使用GC对所有托管堆上的对象实施Finalize方法
            GC.WaitForPendingFinalizers();

            //获取当前进程、当前线程执行的起始时间
            startTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime;
        }

        public void Stop()
        {
            //获取当前进程、当前线程执行所消耗的时间
            duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startTime);
        }

        public TimeSpan Result()
        {
            return duration;
        }
    }


以上,通过当前进程、当前线程的UserProcessorTime属性来统计代码执行时间。

如果使用Stopwatch来统计代码执行时间。

        static void Main(string[] args)
        {
            int[] arrs = new int[10000];
            BuildArray(arrs);

            Stopwatch sw = new Stopwatch();
            sw.Start();
            DisplaySomeDigits(arrs);
            sw.Stop();

            Console.WriteLine("所耗费时间为:" + sw.ElapsedMilliseconds + "毫秒");

        }

为什么使用Stopwatch统计代码执行时间,耗费时间更长呢?
--使用UserProcessorTime属性来统计,统计的是当前进程、当前线程所消耗的CPU执行时间。而Stopwatch统计的代码执行时间,不仅包括了CPU的执行时间,还包括了在电脑屏幕上显示字符串所占用的I/0时间。

时间: 2024-11-10 20:18:52

统计代码执行时间,使用Stopwatch和UserProcessorTime的区别的相关文章

linux下统计代码执行时间

转载自:http://velep.com/archives/973.html 统计函数或某一段代码的运行时间在软件开发中常常遇到.透过运行时间可分析出函数或程序段的运行效率和性能,从而有针对性的对代码进行优化. 在unix环境中,常常用binutils(GNU二进制工具集)中的gprof工具来查看函数运行时间.但本文的重点是自己编写代码实现函数或程序段运行时间的统计.下面进行详细描述. 实现原理 实现原理很简单,在函数或程序段开始运行前,记录开始时间.运行完成后,记录结束时间.把结束时间与开始时

监测代码执行时间之Stopwatch

var sw = new System.Diagnostics.Stopwatch(); sw.Start(); 中间为要执行的代码 sw.Stop(); var msg = "上面操作耗时" + sw.ElapsedMilliseconds + "ms"; 这样就能监测代码的执行时间并进行相应的优化

.Net统计代码执行时间

在.NET中,使用StopWatch类(中文为秒表,非常形象)可以很方便的统计执行时间,示例如下: using System; using System.Diagnostics; using System.Threading; class Program { static void Main(string[] args) { Stopwatch stopWatch = new Stopwatch(); stopWatch.Start(); Thread.Sleep(10000); stopWat

c#实现统计代码执行时间

方法一: //实例化一个计时器 Stopwatch watch = new Stopwatch(); //开始计时 watch.Start(); //此处为要计算的运行代码 for (int i = 1; i < 1000000; i++) { }   // Execute the task to be timed //结束计时 watch.Stop(); //获取当前实例测量得出的总运行时间(以毫秒为单位) string time = watch.ElapsedMilliseconds.ToS

wp8 入门到精通 测量代码执行时间

Stopwatch time = new Stopwatch(); byte[] target = new byte[size]; for (int j = 0; j < size; j++) target[j] = unchecked((byte)j); //Otherwise parts of the array are optimised out. CCMD5Core.GetHash(target); time.Start(); for (int i = 1; i <= iteratio

c# 计算代码执行时间

System.Diagnostics.Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); // 开始监视代码运行时间 // you code .... stopwatch.Stop(); // 停止监视 TimeSpan timespan = stopwatch.Elapsed; // 获取当前实例测量得出的总时间 double hours = timespan.TotalHours; // 总小时 double minutes =

unity中检测代码执行时间

使用unity编写代码的大多数使用的都是c#,c#中可以使用特定的语句来对代码的执行效率进行检测. 检测代码如下: using UnityEngine; using System.Collections; public class Test: MonoBehaviour { void Update() { if (Input.GetKeyDown(KeyCode.G)) { TestExeTime(); } } void TestExeTime() { System.Diagnostics.St

Visual Studio统计代码行数

Visual Studio统计代码行数 按[Ctrl+Shift+F]弹出查找窗口(不统计以#号开头.以/开头的代码和空行) 1.输入  :b*[^:b#/]+.*$ 2.选择使用正则表达式 3.查找文件类型,*.cs多种类型用分号(;)隔开 点击查找全部(查找结果如下)

VS统计代码行数 CTRL+SHIFT+F

1.CTRL+SHIFT+F (Find in files),打开查找功能(如果打不开查看本文最后)2. 勾选 使用:正则表达式,3. 搜索内容: ^:b*[^:b#/]+.*$ #开头和/开头或者空行都不计入代码量. ^:b*[^:b#/*]+.*$ *开头和#开头和/开头或者空行都不计入代码量. 4. 最后一行就是代码行数了. 匹配行:    匹配文件:    合计搜索文件: ----------------------------------------------------------