8 コア プロセッサで 64 ビット Windows 7 を実行しています。私は以下を実行しました:
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <ctime>
using namespace std;
int count = 0;
int t = time(NULL);
//poop() loops incrementing count until it is 300 million.
void poop(void* params) {
while(count < 300000000) {
count++;
}
cout<< time(NULL) - t <<" \n";
}
int _tmain(int argc, _TCHAR* argv[])
{
//_beginthread(poop, 0, NULL);
//_beginthread(poop, 0, NULL);
poop(NULL);
cout<<"done"<<endl;
while(1);
return 0;
}
beginThread のコメントを外したときと結果を比較しました。シングルスレッドバージョンがこれを最も速く達成することがわかりました! 実際には、スレッドを追加すると、プロセスにさらに時間がかかります。カウントを 3 億にすると、プロセスに 8 秒以上かかりました。これは、beginThread の関数呼び出しとその他の小さなオーバーヘッドを除外するのに十分であると考えました。
私は少し調査を行いましたが、マルチスレッド プロセスが遅くなる一般的な結論はオーバーヘッドです。ただし、この場合、複数のスレッドを実行するか、単一のスレッドを実行するかに関係なく、変数カウント (事前に割り当てられた変数であるため、データ セグメントに存在する) がアクセスされる回数は同じです。したがって、基本的に、オーバーヘッド (オーバーヘッドの問題である場合) は、ローカル変数よりもグローバル変数にアクセスする方がコストがかかるという事実から来ているわけではありません。
タスク マネージャーを見ると、シングル スレッドのプロセスは 13% の CPU (約 1/8 コア) を使用しており、スレッドを追加すると CPU 使用率が約 1/8 ずつ増加します。したがって、CPU パワーに関しては、タスク マネージャーがこれを正確に表していると仮定すると、スレッドを追加するとより多くの CPU が使用されます。これはさらに私を混乱させます..別のコアでより多くの全体的なCPUを使用しているのに、タスクを完了するのに全体的に時間がかかっているのはなぜですか?
TLDR: なぜこれが起こるのか