繁体   English   中英

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

[英]How to measure actual time CPU spent executing the code using the 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个任务。 如果处理器未计算任务,秒表中的时间会浪费吗?

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

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

另外,由Microsoft负责,在多处理器环境中运行Stopwatch时应格外小心:

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


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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM