要求是许多“客户”选择他们希望控制和监听事件的一系列资源。通常会有10个左右的客户端和100个左右的资源。但是,客户端和资源的数量可能是1000多个。
目前,这是作为clientid索引的地图实现的,其值为客户端对象。客户端对象包含所选资源的列表问题是如果存在资源的事件,比如资源A,则代码必须遍历每个客户端,然后遍历客户端中的每个列表。我担心表现。
是否有更有效的算法来处理这个可能的瓶颈?
安格斯
答案 0 :(得分:2)
您的结构看起来像{client:[resource]}
但是为了有效地传递事件,您需要{resource:[client]}
答案 1 :(得分:1)
您似乎想要进行反向查找,因此请查看支持此功能的boost.bimap。
答案 2 :(得分:1)
插入标准免责声明:过早优化是不好的,在您知道性能问题之前不要复杂化
如果只有第二个反向数据结构,资源的hashMap,包含感兴趣的客户列表呢?随着克隆和资源的变化,更多的工作,但可能是值得的。
答案 3 :(得分:1)
你有没有运行过探查器?分析器是否将其注册为真正的瓶颈?
对于现代PC来说,10个客户端和100个资源都不算什么。简单的std :: map可以非常快速地获得该查找。 像这样:struct Resource
{
// data 2
};
struct Client
{
// data 2
};
std::map< Client, std::vector< Resource > > mappingClientToResources;
这只是一个想法,并且缺少一些让它工作的东西(例如客户的排序标准)
答案 4 :(得分:0)
或者您也可以将资源列表作为映射,将资源作为键,将布尔值作为值。
像
这样的东西{ client1 : { resource1 : true, resource2: true, resource3:true },... }
而不是你当前的
{ client1 : [resource1,resource2,resource3],....
查找变得更快。