我的方法是否符合线程池方法
Is my approach eligible for a Thread Pool approach?
我已经赢得了32个C++应用程序。我必须将33万个对象加载到内存中。如果我使用顺序方法,大约需要16分钟。在线程方法中,我将330000个对象平均划分为10个容器。我创建了10个线程,并为每个线程分配一个大小为33000对象的容器,以便将它们加载到内存中。这种方法大约需要9分钟。
增加线程数量没有帮助。。。。。
如果我使用ThreadPool,我会得到进一步的改进吗?
一如既往地没有细节,这取决于情况。
您是从磁盘加载对象还是在内存中创建对象?如果你从磁盘加载它们,那么它可能是IO绑定的,所以增加线程数量可能不会有多大帮助。
在您提到的注释中,您正在从数据库加载。我想,当你使用线程时,你会同时进行N个查询吗?可能值得研究一下数据库控制台,以了解它是如何处理许多并发查询的。
另一方面,如果对象是作为某个CPU绑定进程(例如计算pi)的结果创建的,那么增加线程数量的可能性可能比CPU数量更大,这可能不会提高性能(正如ronag在评论中指出的那样,由于上下文切换的增加,可能会损害性能)。
对象之间是否存在依赖关系?这将再次影响事情的发展。
如果您有一组独立的任务,希望以可配置的方式运行这些任务,则通常会使用线程池。听起来,使用线程池是运行具有各种线程设置的大量基准测试的好方法。您还可以配置线程的数量,这将有助于在不同的体系结构/系统上运行。
IME和您的IME,几个线程将加快这类任务的速度。我猜,由于更好地使用了现代控制器上可用的"智能"磁盘缓存,总体吞吐量得到了提高——磁盘/控制器空闲时间减少了,因为总是有线程想要读取某些内容。然而,在只加载了几个线程并且您已绑定到磁盘之后,回报就会递减。在一个稍微相似的应用程序中,我发现任何超过6个线程都没有提供额外的优势&只是占用了更多的内存。
我看不出这些线程的池化或其他方式会对性能产生什么影响——这只是一项必须完成的艰巨工作:(
告诉您的客户他们必须安装SSD
Rgds,Martin
- 方法重写线程C++中的概念
- 使用基类中的派生方法运行线程,而无需使用模板
- 将线程中的数据存储到全局容器的最佳方法?
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 如何将带有参数的方法传递给线程以执行?
- C++ POCO - 如何在不使用 run() 方法的情况下启动线程池上的线程?
- 在销毁期间从另一个线程调用对象上调用方法是否未定义行为?
- C++中的多线程:连接线程的正确方法
- 使用包含互斥锁的类的方法实例化 cpp11 线程
- 如何在JNI中从线程内部调用JAVA方法
- 如何从另一个线程调用颤振引擎方法
- 在另一个线程上发出 QObject 信号的正确方法?
- 在C++线程内实现多个计时器的最安全方法
- C++ std::线程调用方法,从对象原因到调用此类的析构函数
- 将指针传递到另一个线程的正确方法
- 在另一个 QThread 上运行成员方法时,无法将事件发送到其他线程拥有的对象
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- CPP:如何使用需要指针的方法创建线程
- 初始化线程的正确方法
- 从另一个线程更新QT小部件的一种详细方法