Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程池性能测试_C++_Multithreading_Pthreads_Threadpool - Fatal编程技术网

C++ 线程池性能测试

C++ 线程池性能测试,c++,multithreading,pthreads,threadpool,C++,Multithreading,Pthreads,Threadpool,我想比较一个有8个线程(8个线程,因为我的系统上有8个内核)的线程池和一些任务集的单线程池 测试1:给线程池的任务是查看一个队列(std::queue),从中获取一个整数,计算其阶乘并在屏幕上显示。所以,我在ThreadPool类中调用了500次函数addTask,并添加了500个介于1到20之间的数字。因此,并行地,整数被添加,8个线程正在挑选它们并运行以计算阶乘。线程池中已添加到队列的同步。注意将任务添加到线程池队列和全部完成500个作业之间的时间。让我们把这次称为T1 测试2:编写一个简单

我想比较一个有8个线程(8个线程,因为我的系统上有8个内核)的线程池和一些任务集的单线程池

测试1:给线程池的任务是查看一个队列(std::queue),从中获取一个整数,计算其阶乘并在屏幕上显示。所以,我在ThreadPool类中调用了500次函数addTask,并添加了500个介于1到20之间的数字。因此,并行地,整数被添加,8个线程正在挑选它们并运行以计算阶乘。线程池中已添加到队列的同步。注意将任务添加到线程池队列和全部完成500个作业之间的时间。让我们把这次称为T1

测试2:编写一个简单的阶乘函数来计算结果并显示它。运行一个简单循环500次,调用数字范围为1到20的阶乘函数。记下循环前后的时间间隔。让我们把这次称为T2

有趣的是,T2总是小于T1。这怎么可能呢

如果上面的描述不清楚,我不介意分享代码。

多亏了“不确定序列”和“oakad”,上面的描述才有意义。为了总结并确保理解,我进行了以下测试,证明了您的想法:

  • 在任务线程中,删除了cout代码,并添加了将计算出的阶乘写入具有任意名称的新文件的代码。这样就省去了共享资源“显示到计算机屏幕”。这导致T1大约比T2少10倍。在获得同一个文件的锁后,做了一个快速测试来写入该文件,这导致T1>T2,因为共享资源

  • 删除所有cout和文件i/o,而不是计算阶乘,在每个任务线程中运行100万次盲循环。这导致T1远小于T2。由于所有8个线程中都没有共享资源这一事实


  • 如果您发现我弄错了或者需要更多的澄清,请随意添加。

    与线程池开销相比,计算阶乘所花费的时间微不足道。如果你也在使用任务线程进行显示,那么你的所有池线程都只是在摆弄拇指,等待访问共享资源的GUI。关于为什么“并行”不会自动暗示“快速”的一点理论:谢谢,伙计们,上面的说法是有道理的。为了总结并确保理解,我做了以下测试,证明了你的想法:1。在任务线程中,删除cout代码并添加代码,以便每次将计算出的阶乘写入新文件。由此,省略了共享资源“计算机屏幕”。这导致T1大约比T2少10倍。2.删除所有cout和文件i/o,而不是计算阶乘,在每个任务线程中运行100万次盲循环。这导致T1远小于T2。由于所有8个线程中都没有共享资源这一事实。