为分析设置 CPU 亲和力

Set CPU affinity for profiling

我正在从事计算密集型 C# 项目,该项目实现了多种算法。问题是,当我想分析我的应用程序时,特定算法所需的时间会有所不同。例如,有时 运行 算法 100 次需要大约 1100 毫秒,而另一次 运行 算法 100 次需要更多的时间,如 2000 甚至 3000 毫秒。即使在相同的 运行 中也可能有所不同。所以当我优化一段代码时,不可能衡量改进。就是不靠谱。

这是另一个运行:

所以基本上我想确保一个 CPU 专用于我的应用程序。 PC 在 Windows 7 32 位 上安装了旧的 双核 Intel E5300 CPU 运行ning。所以我不能只设置进程亲和性而永远忘记一个核心。这会使计算机在处理日常任务时变得非常慢。我需要其他应用程序在我需要时使用特定的核心,当我完成分析时,CPU 亲和力恢复正常。有一个 bat 文件来完成任务将是一个很好的解决方案。

我的问题是:是否可以有一个 bat 文件来为 windows 7 上的每个进程设置进程关联?

PS:算法正确,每次运行都是相同的代码路径。我创建了一些对象池,所以在第一个 运行 之后,分配了零内存。我还使用 dottrace 分析了内存分配,它显示在第一个 运行 之后没有分配。所以我不相信算法运行时会触发 GC。物理内存可用且系统 运行RAM 不足。

结果: Chris Becke 的回答完全按照预期完成了工作并设置了进程亲和性。它产生了更统一的结果,特别是当 visual studio 和 dottrace 等后台应用程序 运行ning 时。对不同执行时间的进一步调查表明,不可预测性的根源是 CPU 过热。 CPU 温度超过 100C 时,过热警报关闭!所以在修复故障风扇后,结果变得完全一致。

你是说SetProcessAffinityMask

我看到这个问题,虽然标记为 windows,但它是 c#,所以...我看到 System.Diagnostics.Process 对象有一个 ThreadAffinity 成员应该执行相同的功能。

我只是不确定这是否会像您期望的那样稳定 CPU 次。除非另一个线程中断它,否则一个不执行 IO 的繁忙任务应该保持在同一个核心上调度,所以我认为你的可变时间更多是由于其他线程/进程中断你的算法而不是 OS 随机分流你的线程到不同的核心 - 所以除非你为系统中的所有其他线程设置亲和力以排除你的首选核心,否则我看不到这有帮助。