如何使用秒表测量CPU在执行代码上花费的实际时间?

时间:2019-01-16 14:13:09

标签: c# .net visual-studio task stopwatch

我的研究项目的一部分是使用秒表测量时间。

每个秒表用于不同的任务,以测量while循环应运行多长时间。

我想知道我是否做了很多漫长的任务,这种措施会 准确。

想法代码示例:

public static void run(){
    var tasks= new List<Task<int>>();

    foreach(var task in taskList) //taskList is global object with 10 variables inside
        tasks.Add(Task.Factory.StartNew<int>(()=>taskFunction(task)));

    Task.WaitAll(tasks.ToArray());
}

private int taskFunction(task) {
    Stopwatch watch = new Stopwatch();

    while (watch.ElapsedMilliseconds < MaxTime * 1000)
    {
        watch.Start();
        doSomething(); // takes lot of time;
        watch.Stop();

        doSomethingDiffrent();
    }
}

所以我将创建10个任务。如果处理器未计算任务,秒表中的时间是否会运行并浪费时间?

2 个答案:

答案 0 :(得分:2)

  

如果处理器不执行任务,秒表运行时间将浪费。

如果查看System.Diagnostics.Stopwatch的源代码,您会发现它实际上没有运行,这没有浪费。它有两个时间戳startend,并且通过计算和添加两个时间戳之间的周期来实际计数elapsed。请注意,您可以多次启动和停止Stopwatch,它将测量这些运行之间的累积时间。因此,答案是。它还将计算线程不活动时的时间。

另外,Microsoft还在多处理器环境中运行Stopwatch时要小心:

  

在多处理器计算机上,线程在哪个处理器上运行无关紧要。但是,由于BIOS或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的计时结果。要指定线程的处理器亲和力,请使用ProcessThread.ProcessorAffinity方法。


另一方面,如果要测量CPU执行代码所花费的时间,请查看以下链接:ExecutionStopwatch。它基本上利用了GetThreadTimes的用法,并测量了线程在内核或用户模式下一起运行所花费的时间。

答案 1 :(得分:1)

如果您处于调试模式,则可以使用诊断工具

启动应用程序时,进入菜单:

调试-> Windows->显示诊断工具