为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
森林海 2022-07-23 18:11:56
我的部分研究项目是使用秒表来测量时间。每个秒表用于不同的任务,以测量 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 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

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

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

Stopwatch同样由 Microsoft在多处理器环境中运行时应小心:

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


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


查看完整回答
反对 回复 2022-07-23
?
浮云间

TA贡献1829条经验 获得超4个赞

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

当您的应用程序启动时,转到菜单:

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


查看完整回答
反对 回复 2022-07-23
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号