我只是(对我而言)非常奇怪的观察,并想知道这是怎么回事。我测试了以下两个版本的代码:
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()
只是一个庞大的数字计算器,包括一些文件读取操作(没有在那里使用的线程)。
答案 0 :(得分:3)
你得到的唯一开销就是线程创建,因为你的主线程只会睡到加入。
与process_data相比,线程创建开销没有意义,因为您的程序需要7,7或6.5秒才能运行。
所以你的问题现在可以变成:工作线程如何比主线程更快?
为什么会发生这种情况有很多原因,我想起了几个:
操作系统/其他程序通常会在通信,监视等进程的主线程之后进行跟踪,因此主线程比大数据处理的工作线程要慢一些。
即使线程是一个优先级较高的线程,它也不能保证该线程上的东西移动得更快。
这是另一个类似的问题:Why main thread is slower than worker thread in pthread-win32?