I am using the Haptek People Putty player for my C# application and I've seen people say in the forums that it doesn't work well with a multicore processor. My application runs well on my Core 2 Duo laptop but it lags a lot when I try running it on a Quad Core desktop. I was thinking of investigating this for myself and in that case, I would have to force my application to run on a single core. Is that possible in C#?
- 1possible duplicate of [How to set processor affinity from Batch File for Windows XP? ](stackoverflow.com/questions/827754/…)Hans Passant– Hans Passant2010-08-07 11:12:53 +00:00Commented Aug 7, 2010 at 11:12
- Hmm although it's not the exact same problem, but I could use that as a solution. I will probably have to create a batch file for my application instead of just running it directly. I'll try to see if it works tomorrow. Thanks for the link Hans.Paul– Paul2010-08-08 04:20:33 +00:00Commented Aug 8, 2010 at 4:20
3 Answers
Where a Process variable proc holds the process you care about (Process.GetCurrentProcess() for the running Process, obtaining it from GetProcesses() or GetProcessesByName() etc. for another process. Then:
foreach(ProcessThread pt in proc.Threads) { pt.IdealProcessor = 0; pt.ProcessorAffinity = (IntPtr)1; } IdealProcessor is a zero-based identity of a single core. ProcessorAffinity is a bitmask, so 1 allows core zero, 2 allows core one, 3 allows cores zero and one, 4 allows core two, and so on.
I would test this thoroughly. Chances are very strong that this will actually damage your performance, in reducing the ability to make use of different cores, which is after-all generally an advantage.
7 Comments
If the application is single-threaded, it will not take advantage of multiple cores. However, it is possible that the kernel can bump the thread around between cores. I doubt that this is the cause of your performance problems.
If you would like to tie the thread down to a single core (not sure if this can be guaranteed), you might want to check out the System.Diagnostics.ProcessThread.ProcessorAffinity property, although I have never used it myself.
Not really possible IN C#. Well, no way i know off. You need interop, with that it works.
Are you using multiple threads? If not - hm - sorry - not a lot you can do. Standard UI applications are not using multiple cores anyway.
Basically, applications not using Threads (Work items use threads) are inherently single core anyway.