这个额外的线程如何使它比无螺纹更快?

我刚刚(对我)有一个非常奇怪的观察,并想知道这是怎么回事。 我测试了以下两个版本的代码:

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 /其他程序添加了监视器 - >当主线程不空闲时,导致整个运行速度较慢
  • OS /其他程序通常追随通信,观看等过程的主线程,所以主线程比大数据处理的工作线程慢是很平常的。

    即使线程是更高优先级的线程,它也不能保证该线程上的内容会更快地移动。

    下面是另一个类似的问题:为什么主线程比pthread-win32中的工作线程慢?

    链接地址: http://www.djcxy.com/p/20191.html

    上一篇: How does this extra thread make it faster than unthreaded?

    下一篇: Inject IOwinContext with Web API and Ninject