【发布时间】:2017-04-02 02:42:06
【问题描述】:
我想知道是否有一种方法可以加快名为 (path_from_startend) 的无序地图的填充速度。无序映射始终具有唯一键。
#pragma omp parallel for
for (int i=start_index;i<end_index;++i){
for (int j=start_index;j<end_index;++j){
string key= to_string(unique_locations[i])+to_string(unique_locations[j]);
//dont compute path to itself
if (i==j){
}
else {
vector <unsigned> path = pathbot.FindPath(unique_locations[i],unique_locations[j],turn_penalty);
path_from_startend.insert(make_pair(key,path));
}
}
}
【问题讨论】:
-
由于
path_from_startend在线程之间共享,插入操作必须进入临界区。那么问题来了,pathbot.FindPath需要很长时间吗?否则它是没有意义的,因为您正在有效地按顺序填充地图(由于关键部分)。 -
FindPath 是一种 A* 算法,它确实需要一点时间(毫秒)。
-
那我的回答应该可以帮到你。我更新了它,以匹配您的代码。
-
unordered_map 不能在没有同步的情况下被多个线程一次安全地修改;但是无论如何,插入 unordered_map 对象不太可能是您的瓶颈。首先要做的是分析您的进程并查看 CPU 大部分时间花在哪里;例如,您可能会发现大部分时间都花在创建 to_string() 调用中的字符串上,在这种情况下,您可能会考虑以比文本字符串其他(更有效)的格式存储数据。
标签: c++ multithreading hashtable unordered