我的研究项目的一部分是使用秒表测量时间。
每个秒表用于不同的任务,以测量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个任务。如果处理器未计算任务,秒表中的时间是否会运行并浪费时间?
答案 0 :(得分:2)
如果处理器不执行任务,秒表运行时间将浪费。
如果查看System.Diagnostics.Stopwatch
的源代码,您会发现它实际上没有运行,这没有浪费。它有两个时间戳start
和end
,并且通过计算和添加两个时间戳之间的周期来实际计数elapsed
。请注意,您可以多次启动和停止Stopwatch
,它将测量这些运行之间的累积时间。因此,答案是是。它还将计算线程不活动时的时间。
另外,Microsoft还在多处理器环境中运行Stopwatch
时要小心:
在多处理器计算机上,线程在哪个处理器上运行无关紧要。但是,由于BIOS或硬件抽象层(HAL)中的错误,您可以在不同的处理器上获得不同的计时结果。要指定线程的处理器亲和力,请使用
ProcessThread.ProcessorAffinity
方法。
另一方面,如果要测量CPU执行代码所花费的时间,请查看以下链接:ExecutionStopwatch。它基本上利用了GetThreadTimes
的用法,并测量了线程在内核或用户模式下一起运行所花费的时间。
答案 1 :(得分:1)
如果您处于调试模式,则可以使用诊断工具
启动应用程序时,进入菜单:
调试-> Windows->显示诊断工具