我找到了一个很好的question用于测量功能性能,答案建议使用秒表,如下所示
Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
但如果您在多处理器机器下运行,这是否有效?线程可以切换到另一个处理器,可以吗? 同样的事情也应该在Enviroment.TickCount中。 如果答案是肯定的,我应该将我的代码包装在BeginThreadAffinity中,如下所示
Thread.BeginThreadAffinity();
Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
Thread.EndThreadAffinity();
P.S
切换可以在线程级别上发生,而不仅仅是处理器级别,例如,如果该功能在另一个线程中运行,那么系统可以将其切换到另一个处理器,如果发生这种情况,秒表在切换后是否有效?
我不是仅使用秒表进行性能测量,而是使用Thread.Sleep模拟定时器功能(以防止呼叫重叠)
答案 0 :(得分:5)
如果函数本身不是多线程的(例如,它不会产生其他线程/进程并等待它们完成),那么唯一的问题就是你的机器。
如果你的机器忙于做其他事情,它可能会使你的测试无效(例如,在进行CPU限制测试时编码H.264视频)。同样,如果您使用所有物理内存来测试内存限制的内容,那么它可能会使结果无效。
因此,一般原则是在进行此类测试时,机器应处于最小到正常负载之下。除此之外,没有多处理问题。是的,该程序可以在运行时交换核心,但这样做的开销要么是您测量时间的一小部分,要么测得的时间太短,以至于系统时间测量的粒度是一个问题。
答案 1 :(得分:2)
我认为你问的是秒表的低级实现,以及在执行过程中切换处理器是否会使行为无效。该实现在内部使用QueryPerformanceCounter(请参阅MS BCL参考源;至少我已在.NET 4.0中确认过它。)
此API的MS documentation说明:
在多处理器计算机上,哪个处理器无关紧要 调用。但是,您可以在不同的处理器上获得不同的结果 由于基本输入/输出系统(BIOS)或硬件中的错误 抽象层(HAL)。
所以,你是对的;原则上,它应该没关系,但是这个评论表明已经观察到实现不符合预期接口的情况。如果您想保证测量的正确性,可以使用线程关联,如您所述。也就是说,我猜测观察到的任何错误都非常小,因为一个很大的区别是一个非常严重的BIOS或HAL错误。