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

时间:2014-05-06 11:48:56

标签: c++ multithreading c++11

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

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()只是一个庞大的数字计算器,包括一些文件读取操作(没有在那里使用的线程)。

1 个答案:

答案 0 :(得分:3)

你得到的唯一开销就是线程创建,因为你的主线程只会睡到加入。

与process_data相比,线程创建开销没有意义,因为您的程序需要7,7或6.5秒才能运行。

所以你的问题现在可以变成:工作线程如何比主线程更快?

为什么会发生这种情况有很多原因,我想起了几个:

  • 当你创建新主题时,他很幸运并最终成为一个核心
  • 主线程上的操作系统/其他程序添加了观察者 - &gt;当你的主线程没有空闲时,这会导致comp整体运行速度变慢

操作系统/其他程序通常会在通信,监视等进程的主线程之后进行跟踪,因此主线程比大数据处理的工作线程要慢一些。

即使线程是一个优先级较高的线程,它也不能保证该线程上的东西移动得更快。

这是另一个类似的问题:Why main thread is slower than worker thread in pthread-win32?