猿问

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

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


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


森林海
浏览 166回答 2
2回答

慕妹3242003

如果任务未由处理器计算,则会在秒表运行中计时并浪费。如果你查看源代码System.Diagnostics.Stopwatch你会发现它实际上并没有运行,没有浪费。它有两个时间戳start,end它实际上是elapsed通过计算和添加它们之间的周期来计算的。Stopwatch请注意,您可以多次启动和停止,它将测量这些运行之间的累积时间。所以答案是肯定的,它还会计算线程处于非活动状态的时间。Stopwatch同样由 Microsoft在多处理器环境中运行时应小心:在多处理器计算机上,线程运行在哪个处理器上并不重要。但是,由于 BIOS 或硬件抽象层 (HAL) 中的错误,您可以在不同的处理器上获得不同的计时结果。要为线程指定处理器亲和性,请使用该ProcessThread.ProcessorAffinity方法。另一方面,如果您想测量 CPU 执行代码所花费的时间,请查看以下链接:ExecutionStopwatch。它基本上利用GetThreadTimes并测量线程在内核或用户模式下一起运行所花费的时间。

浮云间

如果您处于调试模式,则可以使用诊断工具当您的应用程序启动时,转到菜单:调试 --> Windows --> 显示诊断工具
随时随地看视频慕课网APP
我要回答