- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我编写了以下并行代码来检查 vector vector 中的所有元素。我只存储来自 vector<vector<int> >
的那些元素满足给定条件。但是,我的问题是 vector<vector<int> >
中的一些 vector 很大,而其他的很小。由于我的代码需要很长时间才能执行 thread.join()。有人可以建议我如何提高我的代码的性能。
void check_if_condition(vector<int>& a, vector<int>& satisfyingElements)
{
for(vector<int>::iterator i1=a.begin(), l1=a.end(); i1!=l1; ++i1)
if(some_check_condition(*i1))
satisfyingElements.push_back(*i1);
}
void doWork(std::vector<vector<int> >& myVec, std::vector<vector<int> >& results, size_t current, size_t end)
{
end = std::min(end, myVec.size());
int numPassed = 0;
for(; current < end; ++current) {
vector<int> satisfyingElements;
check_if_condition(myVec[current], satisfyingElements);
if(!satisfyingElements.empty()){
results[current] = satisfyingElements;
}
}
}
int main()
{
std::vector<std::vector<int> > myVec(1000000);
std::vector<std::vector<int> > results(myVec.size());
unsigned numparallelThreads = std::thread::hardware_concurrency();
std::vector<std::thread> parallelThreads;
auto blockSize = myVec.size() / numparallelThreads;
for(size_t i = 0; i < numparallelThreads - 1; ++i) {
parallelThreads.emplace_back(doWork, std::ref(myVec), std::ref(results), i * blockSize, (i+1) * blockSize);
}
//also do work in this thread
doWork(myVec, results, (numparallelThreads-1) * blockSize, myVec.size());
for(auto& thread : parallelThreads)
thread.join();
std::vector<int> storage;
storage.reserve(numPassed.load());
auto itRes = results.begin();
auto itmyVec = myVec.begin();
auto endRes = results.end();
for(; itRes != endRes; ++itRes, ++itmyVec) {
if(!(*itRes).empty())
storage.insert(storage.begin(),(*itRes).begin(), (*itRes).end());
}
std::cout << "Done" << std::endl;
}
最佳答案
如果您能给出一些“大”内部 vector 的比例,看看问题有多严重,那就太好了。
不过,我认为您的问题是这样的:
for(auto& thread : parallelThreads)
thread.join();
这个位使得在所有线程上依次通过并等待它们完成,然后才查看下一个。对于线程池,您希望等到每个线程都完成。这可以通过为每个要完成的线程使用 condition_variable 来完成。在他们完成之前,他们必须通知您可以等待的 condition_variable。
查看您的实现,这里更大的问题是您的工作线程在消耗方面不平衡。
为了在所有线程上获得更均衡的负载,您需要扁平化数据结构,以便不同的工作线程可以处理相对相似大小的数据 block 。我不确定您的数据来自哪里,但是在处理大型数据集的应用程序中使用一个 vector 的 vector 听起来不是一个好主意。要么将现有的 vector vector 处理成一个 vector ,要么尽可能地读取数据。如果您的处理需要行号,您可以保留一个开始-结束范围的 vector ,您可以从中找到您的行号。
一旦你有了一个大 vector ,你就可以将它分解成大小相等的 block 以提供给工作线程。其次,您不想在处理堆栈并将它们插入另一个 vector 中构建 vector ,因为您很可能在线程工作期间遇到分配内存的问题。分配内存是全局状态更改,因此需要一定程度的锁定(通过适当的地址分区可以避免)。根据经验,每当您寻求性能时,您都应该从性能关键部分移除动态分配。
在这种情况下,您的线程可能宁愿“标记”元素是满足条件的,而不是构建满足元素的 vector 。一旦完成,您就可以只遍历好的,而无需推送和复制任何内容。这样的解决方案会减少浪费。
事实上,如果我是你,我会先尝试在单线程上解决这个问题,按照上面的建议。如果你摆脱 vector 的 vector 结构,并有条件地迭代元素(这可能就像使用 C++11 标准库提供的 xxxx_if 算法一样简单),你最终可能会获得足够好的性能。只有在那个时候才值得考虑将这项工作的大部分委托(delegate)给工作线程。此时在您的代码中,几乎没有理由使用工作线程,只是为了过滤它们。尽可能少地书写和移动,你会获得很多性能。并行化仅在某些情况下效果很好。
关于c++ - 加入线程时的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400347/
我想对 JOIN 进行特定的排序 SELECT * FROM (lives_in as t1 NATURAL JOIN preferences p1) l1 JOIN (lives_in t2 NAT
我正在努力解决一个查询。并想知道是否有人可以提供帮助。 我有一个标签表(服务请求票)和序列号表 从我的标签中我正在这样做 Select * from tag where tag.created BET
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我有两个表 tbl_user 和 tbl_lastchangepassword,如下所示 表 tbl_user id| name --------- 1 | user1 2 | user2 3 |
我有下一个问题 SELECT i.*, gu.* vs.* FROM common.global_users gu LEFT JOIN common.global_users_perms gup ON
我有一个电影表和一个投票表。用户为他们喜欢的电影投票。我需要显示按电影总票数降序排列的电影列表。我现在所拥有的有点作品。唯一的问题是它不显示 0 票的电影。 SELECT m.name, m.imdb
我有一个由这样的表组成的 mySql 数据库: 我如何(如果可能的话)使用 JOINS 从名称/周期表中获取结果?简单来说,它是如何工作的?我向菜鸟问题道歉。我对此很陌生。任何帮助将不胜感激。 最佳答
我需要查询单元先决条件的自引用关系。 我知道您需要使用两个联接,我是否选择我的列然后将其联接到自身? SELECT u.unit_code, u.name + ' is a prerequisi
我有两个实体,用户和友谊,它们看起来像: public class User { public int UserId { get; set; } (..
假设我有两个表: Table A ProdID | PartNumber | Data... 1 | ABC-a | "Data A" 2 | (null) |
说我有这个数据, (df <- data.frame( col1 = c('My','Your','His','Thir'), col2 = c('Cat','Dog','Fish','Dog')))
我有两个这样的数组,实际上这是从两个不同的服务器检索的 mysql 数据: $array1 = array ( 0 => array ( 'id' => 1, 'n
我的数据库中有以下表格 CREATE TABLE [author_details] ( [_id] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [name
我正在努力使用一个相当简单的 sql select 语句的 join/where 子句。 我正在尝试从 tb1 中检索产品信息列表,其中 where 条件位于 tbl2 中,但这必须由三个不同的列连接
我正在寻找以下功能: Applicative f => f (f a) -> f a Hoogle给我看join : >:t join join :: Monad m => m (m a) -> m
我有两个“表”,分别是 USER 和 CONGE。在表“CONGE”中,我插入了用户的 ID。但是我不知道如何根据用户的id显示用户的休假。 我想根据id发布“Congé”。 { "conge"
我们有一个具有(简化)结构的文档,如Elasticsearch所示: { _id: ..., patientId: 4711, text: "blue" } { _id: ..., patientId
这两个sql语句有什么区别 a) 从 T1,T2 中选择 *,其中 T1.A=T2.A ; b) 从 T1,T2 中选择 *,其中 T2.A=T1.A ; 在这两种情况下我得到相同的输出,这两种语句之
我想做一个简单的连接,只是比较两个表中的 ID.. 我有我的组表,包含; 身份证 姓名 等.. 我的 GroupMap 表包含; 身份证 组号 元素编号 我的查询采用 GroupMap.ItemID
所以我有一组主要数据,如下所示: value_num code value_letter 1 CDX A 2 DEF B
我是一名优秀的程序员,十分优秀!