【问题标题】:How to measure actual time CPU spent executing the code using the stopwatch?如何使用秒表测量 CPU 执行代码所花费的实际时间?
【发布时间】:2019-06-10 15:37:43
【问题描述】:

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

每个秒表用于不同的任务,以测量 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 个任务。如果任务不是由处理器计算,是否会在秒表中运行并浪费时间?

【问题讨论】:

  • 是的,它应该可以正确运行和测量。如果在任务之外声明了 thr StopWatch,您可能会遇到线程问题,因为它不是线程安全的。
  • 好的,谢谢。我不知道为什么人们会减去这个问题..

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


【解决方案1】:

如果任务没有被处理器计算,则会在秒表运行中计时并浪费。

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

另外,微软在多处理器环境中运行 Stopwatch 时应该小心:

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


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

【讨论】:

  • 我可以用什么代替?
  • Stopwatch 仍然是最好的选择,这只是一个警告。如果您真的想要精确测量,那么您需要通过分配ProcessThread.ProcessorAffinity 来确保您的线程始终在同一处理器上运行。
  • 那么如果线程没有运行就没有办法停止秒表吗?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-06
    • 2010-09-23
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多