Заставить приложение C# использовать одно ядро на ПК с многоядерным процессором

Привет, ребята этот вопрос может показаться странным, но я использую haptek People Putty player для моего приложения c#, и я видел, как люди говорят на форумах, что он не работает хорошо с многоядерным процессором. Мое приложение хорошо работает на моем ноутбуке Core 2 Duo, но оно сильно отстает, когда я пытаюсь запустить его на четырехъядерном рабочем столе. Я думал исследовать это для себя, и в этом случае мне придется заставить мое приложение работать на одном ядре. Возможно ли это в C#? Спасибо!

3 ответов


где Process переменная proc удерживает процесс, о котором вы заботитесь (Process.GetCurrentProcess() для запущенного процесса, получив от GetProcesses() или GetProcessesByName() etc. для другого процесса. Затем:

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

IdealProcessor-это нулевая идентичность одного ядра. ProcessorAffinity-это битовая маска, поэтому 1 позволяет нулю ядра, 2 позволяет ядру один, 3 позволяет ядрам ноль и один, 4 позволяет ядру два и так далее.

Я бы проверил это тщательно. Шансы очень велики, что это фактически повредит вашей производительности, уменьшив возможность использования разных ядер, что в конечном итоге является преимуществом.


Если приложение однопоточное, оно не будет использовать преимущества нескольких ядер. Тем не менее, возможно, что ядро может столкнуться с потоком между ядрами. Я сомневаюсь, что это является причиной ваших проблем с производительностью.

Если вы хотите привязать нить к одному ядру (не уверен, что это можно гарантировать), вы можете проверить System.Diagnostics.ProcessThread.ProcessorAffinity собственность, хотя я никогда не использовал его сам.


  • на самом деле невозможно в C#. Ну, я точно не знаю. Вам нужен interop, с этим он работает.

  • вы используете несколько потоков? Если нет-Хм-извините-не много вы можете сделать. Стандартные приложения UI не используют несколько ядер в любом случае.

в принципе, приложения, не использующие потоки (рабочие элементы используют потоки), по своей сути являются одноядерными.