这个额外的线程如何使它比无螺纹更快?
我刚刚(对我)有一个非常奇怪的观察,并想知道这是怎么回事。 我测试了以下两个版本的代码:
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
process_data(l, 8);
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
cout << "time used: " << time_span.count() << endl;
VS
chrono::steady_clock::time_point t1 = chrono::steady_clock::now();
thread t1 = thread(process_data, l, 8);
t1.join();
chrono::steady_clock::time_point t2 = chrono::steady_clock::now();
chrono::duration<double> time_span = chrono::duration_cast<chrono::duration<double>>(t2 - t1);
cout << "time used: " << time_span.count() << endl;
由于我不明白的原因,第二个版本快20%...
怎么会这样? chrono::steady_clock
应该正确地测量时间,我认为......但是我没有看到如何创建另一个线程,并且等待它的速度实际上可以比使用初始线程更快。 我错过了什么?
一些细节:除了在上面发布的片段之前定义l之外,没有其他代码,并且在它之后没有其他计算(它是主函数), process_data()
仅仅是一个庞大的数字计算器,包括一些文件读取操作(没有使用那里的线程)。
你得到的唯一的开销是创建线程,因为你的主线程会一直睡到连接。
考虑到你的程序运行需要7,7或6,5秒,线程创建开销与process_data相比毫无意义。
所以你的问题现在可以变成:工作者线程如何比主线程更快?
为什么会出现这种情况有很多原因,我想起了一些情况:
OS /其他程序通常追随通信,观看等过程的主线程,所以主线程比大数据处理的工作线程慢是很平常的。
即使线程是更高优先级的线程,它也不能保证该线程上的内容会更快地移动。
下面是另一个类似的问题:为什么主线程比pthread-win32中的工作线程慢?
链接地址: http://www.djcxy.com/p/20191.html上一篇: How does this extra thread make it faster than unthreaded?