我在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 +其他小的开销。
我做了一些研究,多线程进程的总体结论是较慢的是开销。但在这种情况下,无论我是运行多个线程还是单个线程,访问的变量数(存在于数据段中,因为它是预分配变量afaik)的次数是相等的。所以基本上,开销(如果是开销问题)并不是来自访问全局变量比局部变量花费更多的事实。
看看我的任务管理器,使用单线程的进程使用13%cpu(大约1/8核心),并且添加线程以1/8的增量增加CPU使用率。所以就CPU的能力而言,假设任务管理器准确地描述了这一点,添加线程使用更多的CPU。哪一个让我更加困惑......我是如何使用更多的整体CPU,拥有不同的核心,但总体来说需要更长时间才能完成任务?
TLDR:为什么会这样
这看起来像是多个线程同时修改变量的雷区。 – chris 2013-03-28 03:05:04
是。缓存线路争用。 – 2013-03-28 03:06:09
多线程修改同一对象而不同步:未定义的行为。 – 2013-03-28 12:13:27