私はn個のスレッドを開始し、各スレッドに負荷をかける簡単なプログラムを持っています。 私は1つのスレッドだけを開始すると、1つのコアが約100%の負荷を得ます。 1つのプロセスを16スレッド(コアごとに1つのスレッドを意味します)で開始すると、負荷が約80%になります。 2つのスレッド(コアごとに1つのスレッドを意味する)で8つのプロセスを開始すると、約99%の負荷がかかります。 このサンプルではロックを使用していません。なぜ2つのスレッドを持つ8つのプロセスが、16のスレッドを持つ1つのプロセスより多くの負荷を生成するのですか?
この動作の理由は何ですか? OSが多くのスケジュールを設定する必要があるため、100スレッドが動作すると負荷が低下することを理解しています。 しかしこの場合、コアと同じ数のスレッドしかありません。
さらに悪いです(私にとっては少なくとも)。 ループに単純なthread.sleep(0)を追加すると、1つのプロセスと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 ++; '、私は1つのプロセスと16スレッドで100%の負荷を得ました。 – Manuel