【发布时间】:2009-02-03 21:40:52
【问题描述】:
有没有办法关闭多线程或限制 F# 应用程序使用的内核数量?我知道这不会在生产环境中完成,但我很好奇我是否必须在单核系统上实际安装应用程序才能看到它的性能。
【问题讨论】:
标签: multithreading f#
有没有办法关闭多线程或限制 F# 应用程序使用的内核数量?我知道这不会在生产环境中完成,但我很好奇我是否必须在单核系统上实际安装应用程序才能看到它的性能。
【问题讨论】:
标签: multithreading f#
您可以在应用程序的开头通过设置当前进程的 ProcessorAffinity 的值来简单地设置它:
System.Diagnostics.Process.GetCurrentProcess().ProcessorAffinity <- nativeint 1
这将有效地将用于进程的内核限制为系统上的第一个 CPU。
【讨论】:
调整寄存器或者使用Process.ProcessorAffinty直接修改windows进程调度器。这是一种不好的做法,因为它依赖于平台,并且还可能产生难以确定原因的程序行为。如果可能,最好通过 .NET 本身执行此操作,而不使用 System.Diagnostics.Process 等 PInvoke 包装器。
如果您只希望您的应用程序使用单个线程,我建议通过将以下内容添加到您的 app.config 来将垃圾收集器设置为非并发:
<configuration>
<runtime>
<gcConcurrent enabled="false"/>
</runtime>
</configuration>
有关更多信息,请参阅我关于此主题的帖子here。
如果您想明确限制线程数的上限和下限,最好使用ThreadPool 对象。通过使用SetMaxThreads 和SetMinThreads,您可以安全地执行这些限制,而无需接触Windows 系统调度程序。
使用 ThreadPool 的唯一重大限制是,在使用此方法时,您不能将最小线程数设置为小于计算机中的处理器数。
【讨论】:
您可以通过tweaking the registry 设置进程亲和性,这将根据需要限制您的应用程序。
【讨论】: