8

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#?

2
  • 1
    possible duplicate of [How to set processor affinity from Batch File for Windows XP? ](stackoverflow.com/questions/827754/…) Commented 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. Commented Aug 8, 2010 at 4:20

3 Answers 3

7

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.

Sign up to request clarification or add additional context in comments.

7 Comments

Thanks Jon! I also tried doing this yesterday and it worked for my application. You're right it will hinder performance but it's the only way I could force People Putty to work :( Actually the program works with dual core processors, but since I ran it on a quad core it really slowed down. Now that I got that down to 2, it seems to be working good enough.
@akim That edit makes no sense, as then it would refer to the current process which is contrary to the question.
@JonHanna, current snippet will not compile. and it make only first thread to run on single process, but not all threads.
@akim I see the actual mistake now, and have fixed it.
This still won't compile: You can't iterate over one Thread, you want to iterate over proc.Threads not proc.Threads[0]or am I missing something?
|
2

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.

2 Comments

Thanks Ani, I'll try to see if I can use that
Hey Ani, setting the ProcessorAffinity got it working! Thanks! :)
1
  • 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.

2 Comments

My application doesn't use multiple threads. The Haptek People Putty player just provided a DLL so I don't know what it actually does inside. I don't know if they have multiple threads or what not. I guess the problem would lie there since I don't have access to their code :(
I would agree on that. Could be the hosting of them. You are declaring STA Threading as the VS templates do?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.