【问题标题】:Force C# application to use a single core in a PC with a multicore processor强制 C# 应用程序在具有多核处理器的 PC 中使用单核
【发布时间】:2011-03-26 16:36:43
【问题描述】:

我正在为我的 C# 应用程序使用 Haptek People Putty 播放器,我在论坛上看到人们说它不适用于多核处理器。我的应用程序在我的 Core 2 Duo 笔记本电脑上运行良好,但当我尝试在四核台式机上运行它时,它却滞后了很多。我正在考虑为自己进行调查,在这种情况下,我将不得不强制我的应用程序在单核上运行。这在 C# 中可能吗?

【问题讨论】:

  • [How to set processor affinity from Batch File for Windows XP? 的可能重复项? ](stackoverflow.com/questions/827754/…)
  • 嗯,虽然这不是完全相同的问题,但我可以将其用作解决方案。我可能不得不为我的应用程序创建一个批处理文件,而不是直接运行它。我明天试试看能不能用。感谢汉斯的链接。

标签: c# core multiprocessor


【解决方案1】:

其中Process 变量proc 保存您关心的进程(Process.GetCurrentProcess() 用于正在运行的进程,从GetProcesses()GetProcessesByName() 等获取它以用于另一个进程。然后:

foreach(ProcessThread pt in proc.Threads)
{
   pt.IdealProcessor = 0;
   pt.ProcessorAffinity = (IntPtr)1;
}

IdealProcessor 是一个从零开始的单核标识。 ProcessorAffinity 是一个位掩码,因此 1 允许核心 0,2 允许核心 1,3 允许核心 0 和 1,4 允许核心 2,依此类推。

我会彻底对此进行测试。很有可能这实际上会损害您的性能,降低使用不同内核的能力,毕竟这通常是一个优势。

【讨论】:

  • 谢谢乔恩!我昨天也试过这样做,它适用于我的应用程序。你是对的,它会影响性能,但这是我可以强迫 People Putty 工作的唯一方法 :( 实际上该程序适用于双核处理器,但由于我在四核上运行它,它真的变慢了。现在我明白了降到 2,它似乎工作得很好。
  • @akim 该编辑没有意义,因为它会引用与问题相反的当前进程。
  • @JonHanna,当前的 sn-p 将无法编译。它只使第一个线程在单个进程上运行,而不是所有线程。
  • @akim 我现在看到了真正的错误,并已修复它。
  • 这仍然无法编译:你不能迭代一个线程,你想迭代 proc.Threads 而不是 proc.Threads[0] 或者我错过了什么?
【解决方案2】:

如果应用程序是单线程的,它将不会利用多核。但是,内核可能会在内核之间颠簸线程。我怀疑这是您的性能问题的原因。

如果您想将线程绑定到单个核心(不确定是否可以保证),您可能需要查看System.Diagnostics.ProcessThread.ProcessorAffinity 属性,尽管我自己从未使用过它。

【讨论】:

  • 谢谢阿尼,我试试看能不能用
  • 嘿 Ani,设置 ProcessorAffinity 让它工作了!谢谢! :)
【解决方案3】:
  • 在 C# 中确实不可能。好吧,我不知道。您需要互操作,这样才能正常工作。

  • 您是否使用多个线程?如果不是 - 嗯 - 对不起 - 你可以做的不多。无论如何,标准 UI 应用程序不使用多核。

基本上,不使用线程(工作项使用线程)的应用程序本质上是单核的。

【讨论】:

  • 我的应用程序没有使用多线程。 Haptek People Putty 播放器只是提供了一个 DLL,所以我不知道它在里面实际做了什么。我不知道他们是否有多个线程或没有。我想问题就出在那儿,因为我无法访问他们的代码:(
  • 我同意这一点。可能是他们的主机。您要像 VS 模板一样声明 STA 线程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-29
  • 2015-12-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多