我正在开发一个计算密集型的C#项目,它实现了几种算法。问题是,当我想要分析我的应用程序时,特定算法所需的时间会有所不同。例如,有时运行算法100次需要大约1100毫秒,而另一次运行100次需要花费更多时间,如2000或甚至3000毫秒。即使在同一次运行中它也可能有所不同。因此,在优化一段代码时,无法衡量改进。这是不可靠的。
这是另一次运行:
所以基本上我想确保一个CPU专用于我的应用程序。 PC有一个旧的双核Intel E5300 CPU在 Windows 7 32位上运行。所以我不能只设置进程亲和力而永远忘掉一个核心。它会使计算机在日常任务中变得非常慢。我需要其他应用程序在我想要的时候使用特定的核心,当我完成分析时,CPU的亲和力恢复正常。使用bat文件来完成任务将是一个很棒的解决方案。
我的问题是:是否可以使用bat文件为Windows 7上的每个进程设置进程关联?
PS:算法正确,每次都运行相同的代码路径。我创建了一些对象池,所以在第一次运行后,分配了零内存。我还使用dottrace描述了内存分配,并且在首次运行后没有显示分配。因此,我不相信算法运行时会触发GC。物理内存可用,系统内存不低。
结果:Chris Becke的答案完成了工作并完全按照预期设置了流程亲和力。特别是当visual studio和dottrace等后台应用运行时,它会产生更均匀的结果。对不同执行时间的进一步调查表明,不可预测性的根源是CPU过热。当温度超过100℃时,CPU过热报警关闭!因此在固定故障风扇后,结果变得完全均匀。
答案 0 :(得分:2)
你的意思是SetProcessAffinityMask?
我看到这个问题,虽然标记的窗口是c#,所以......我看到System.Diagnostics.Process
对象有一个ThreadAffinity
成员应该执行相同的功能。
我只是不确定这会以你期望的方式稳定CPU时间。一个没有执行IO的繁忙任务应该保留在同一个核心上,除非另一个线程中断它,所以我认为你的变量时间更多是由于其他线程/进程中断你的算法而不是操作系统随机将你的线程分流到另一个核心 - 所以除非你为系统中的所有其他线程设置亲和力以排除你喜欢的核心,否则我看不到这有帮助。