【问题标题】:Thread pool performance test线程池性能测试
【发布时间】:2023-04-04 02:02:01
【问题描述】:

我想比较具有 8 个线程(8 个线程,因为我的系统上有 8 个内核)的线程池与用于某些任务集的单线程。

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

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

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

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

【问题讨论】:

  • 与线程池开销相比,计算阶乘所花费的时间微不足道。如果您还使用任务线程进行显示,那么您所有的池线程都只是在摆弄他们的拇指,等待访问作为共享资源的 GUI。
  • 关于为什么“并行”不会自动暗示“快”的一点理论:en.wikipedia.org/wiki/Amdahl%27s_law
  • 谢谢各位,上面说的很有道理。为了得出结论并确保理解,我运行了以下测试,证明了您的想法: 1. 在任务线程中,删除 cout 代码并添加代码以每次将计算的阶乘写入新文件中。这样,共享资源“计算机屏幕”就被省略了。这导致 T1 比 T2 小 10 倍左右。 2. 去掉了所有的cout和文件i/o,而不是计算阶乘,在每个任务线程中跑了一百万次盲循环。这导致 T1 远小于 T2。由于这个事实,所有 8 个线程中都没有共享资源。

标签: c++ multithreading pthreads threadpool


【解决方案1】:

多亏了“indeterminately sequenced”和“oakad”,以上内容才有意义。为了得出结论并确保理解,我进行了以下测试,证明了您的想法:

  1. 在任务线程中,删除 cout 代码并添加代码以将计算的阶乘写入具有任意名称的新文件中。这样,共享资源“显示到计算机屏幕”就被省略了。这导致 T1 比 T2 小 10 倍左右。在获得锁定后对同一文件进行了快速测试,由于共享资源,这导致 T1>T2。

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

如果您发现我有误或需要更多说明,请随时补充。

【讨论】:

    猜你喜欢
    • 2014-11-22
    • 2016-03-19
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 2021-09-21
    相关资源
    最近更新 更多