对代码性能进行调试和量测
在研究数据结构和算法的时候,或者你仅仅是在对某段代码的性能心存疑惑想找到问题所在的时候,我们通常都需要能度量和比较代码执行的耗时。大部分时候,我们都可以通过下面这个简单的手段来实现该目的。
第一步:定义一个Timing类,用来辅助我们进行一些性能方面的比较(主要监控时间)
using System; using System.Diagnostics; public class Timing { TimeSpan startingTime; TimeSpan duration; public Timing() { startingTime = new TimeSpan(0); duration = new TimeSpan(0); } public void StartTime() { GC.Collect(); GC.WaitForPendingFinalizers(); startingTime = Process.GetCurrentProcess().Threads[0].UserProcessorTime; } public void StopTime() { duration = Process.GetCurrentProcess().Threads[0].UserProcessorTime.Subtract(startingTime); } public TimeSpan Result { get { return duration; } } }
第二步: 具体使用的方法
class Program { static void Main(string[] args) { int[] numbers = new int[100000]; Timing timing = new Timing(); timing.StartTime(); BuildArray(ref numbers); DisplayNumbers(numbers); timing.StopTime(); Console.WriteLine(); Console.WriteLine("总计耗时为:{0}秒",timing.Result.TotalSeconds); Console.Read(); } private static void DisplayNumbers(int[] numbers) { for (int i = 0; i < numbers.GetUpperBound(0); i++) { Console.Write(numbers[i]); } } private static void BuildArray(ref int[] numbers) { for (int i = 0; i < numbers.GetUpperBound(0); i++) { numbers[i] = i * (new Random()).Next(); } } }
最后输出的结果可能是这样的
要注意到问题
1. 在Visual Studio 调试中是看不到效果的,因为其实在调试中是没有独立的进程的,是由Visual Studio进行宿主
2. 即便在代码中使用到了Thread.Sleep方法(线程休眠),也不会影响到最后输出的时间。因为我们是统计CPU时间,线程如果休眠,CPU并不需要占用时间