我有一个简单的程序,它启动n个线程并在每个线程上创建一些负载。 如果我只启动一个线程,一个内核获得大约100%的负载。 如果我用16个线程(这意味着每个内核有一个线程)启动一个进程,我只能获得大约80%的负载。 如果我用2个线程启动8个进程(这仍然意味着每个内核有一个线程),那么我得到大约99%的负载。 我没有在这个示例中使用任何锁定。为什么有两个线程的8个进程每个创建的负载都比一个具有16个线程的进程多?
这种行为的原因是什么? 我知道如果有100个线程工作,负载就会下降,因为操作系统必须安排很多工作。 但是在这种情况下,只有与内核一样多的线程。
它更糟糕(对我来说至少)。 如果我在我的循环中添加一个简单的thread.sleep(0),带有一个进程和16个线程的负载增加高达95%。
任何人都可以回答这个问题,或提供有关此特定主题的更多信息的链接?
//Sample application which reads the number of threads to be started from Console.ReadLine
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter the number of threads to be started");
int numberOfThreadsToStart;
string input = Console.ReadLine();
int.TryParse(input, out numberOfThreadsToStart);
if(numberOfThreadsToStart < 1)
{
Console.WriteLine("No valid number of threads entered. Exit now");
Thread.Sleep(1500);
return;
}
List<Thread> threadList = new List<Thread>();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < numberOfThreadsToStart; i++)
{
Thread workerThread = new Thread(MakeSomeLoad);
workerThread.Start();
threadList.Add(workerThread);
}
while (true)
{
Console.WriteLine("I'm spinning... ");
Thread.Sleep(2000);
}
}
static void MakeSomeLoad()
{
for (int i = 0; i < 100000000; i++)
{
for (int j = 0; j < i; j++)
{
//uncomment the following line to increase the load
//Thread.Sleep(0);
StringBuilder sb = new StringBuilder();
sb.Append("hello world" + j);
}
}
}
}
这似乎是原因,如果我用这样的东西替换stringbuilder:'int x = i + j; int z = x ++;',我用一个进程和16个线程获得了100%的负载。 – Manuel 2012-02-17 15:49:30