Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多处理器机器中秒表的最佳实践?_C#_Multiprocessor_Performance - Fatal编程技术网

C# 多处理器机器中秒表的最佳实践?

C# 多处理器机器中秒表的最佳实践?,c#,multiprocessor,performance,C#,Multiprocessor,Performance,我发现了一个测量功能性能的好方法,答案建议使用秒表,如下所示 Stopwatch sw = new Stopwatch(); sw.Start(); //DoWork sw.Stop(); //take sw.Elapsed Thread.BeginThreadAffinity(); Stopwatch sw = new Stopwatch(); sw.Start(); //DoWork sw.Stop(); //take sw.Elapsed Thread.EndThreadAffinity

我发现了一个测量功能性能的好方法,答案建议使用秒表,如下所示

Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
Thread.BeginThreadAffinity();
Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
Thread.EndThreadAffinity();
但如果您在多处理器机器下运行,这是否有效?线程可以切换到另一个处理器,是吗? 同样的事情也应该发生在Environment.TickCount中。 如果答案是“是”,我是否应该将代码包装在BeginThreadAffinity中,如下所示

Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
Thread.BeginThreadAffinity();
Stopwatch sw = new Stopwatch();
sw.Start();
//DoWork
sw.Stop();
//take sw.Elapsed
Thread.EndThreadAffinity();
附言


切换可以发生在线程级别,而不仅仅是处理器级别,例如,如果函数在另一个线程中运行,那么系统可以将其切换到另一个处理器,如果发生这种情况,秒表在切换后是否有效


我不仅使用秒表进行性能测量,还使用Thread.Sleep(防止调用重叠)模拟计时器函数。

如果函数本身不是多线程的(例如,它不会产生其他线程/进程并等待它们完成),那么唯一的问题是您的机器

如果您的计算机忙于执行其他操作,则可能会使测试无效(例如,在执行CPU限制测试时对H.264视频进行编码)。同样,如果您在测试内存受限的内容时使用了所有物理内存,那么它可能会使您的结果无效


因此,一般原则是,进行此类测试时,机器应处于最小至正常负载下。除此之外,没有多处理问题。对该程序可以在运行时交换内核,但这样做的开销是测量时间的一小部分,或者测量的时间太小,所以系统的时间测量的粒度是一个问题。

< P>我想你是在问低级实现秒表和中间的交换处理器。执行的错误可能会使该行为无效。该实现在内部确实使用了QueryPerformanceCounter(请参阅MS BCL参考源代码;我至少在.NET 4.0中确认了这一点)

此API的标准说明:

在多处理器计算机上,使用哪个处理器并不重要 打电话。但是,您可以在不同的处理器上获得不同的结果 由于基本输入/输出系统(BIOS)或硬件中的错误 抽象层(HAL)


所以,你是对的;原则上,这不重要,但这一评论表明,已经观察到了实现与预期接口不一致的情况。如果您想保证度量的正确性,可以使用线程关联,正如您所说的。也就是说,我猜观察到的任何错误都非常小,因为较大的差异将是相当严重的BIOS或HAL错误。

如果函数在后台线程中运行,这意味着函数线程可以切换到另一个处理器,从而导致测量中的错误,根据MSDN:“后台线程与前台线程相同,只是后台线程不阻止进程终止。”Ref:@Tormod Fjeldskår,前台/后台线程可以切换到其他处理器,因此我不关心它的类型,但我在我的评论中提到了它,例如不多