C++ 查找问题的优化
要求是许多“客户机”选择一系列他们希望控制和侦听事件的资源。通常会有10个左右的客户端和100个左右的资源。然而,客户机和资源的数量可能会超过1000个 这当前实现为一个由clientid索引的映射,其值为客户机对象。客户机对象包含所选资源的列表。问题是,如果资源(如资源a)发生事件,则代码必须循环遍历每个客户机,然后遍历客户机内的每个列表。我关心表现 有没有更有效的算法来处理这个可能的瓶颈C++ 查找问题的优化,c++,algorithm,lookup,C++,Algorithm,Lookup,要求是许多“客户机”选择一系列他们希望控制和侦听事件的资源。通常会有10个左右的客户端和100个左右的资源。然而,客户机和资源的数量可能会超过1000个 这当前实现为一个由clientid索引的映射,其值为客户机对象。客户机对象包含所选资源的列表。问题是,如果资源(如资源a)发生事件,则代码必须循环遍历每个客户机,然后遍历客户机内的每个列表。我关心表现 有没有更有效的算法来处理这个可能的瓶颈 Angus您似乎想进行反向查找,因此请查看支持此功能的。插入标准免责声明:过早优化是不好的,在您知道存在
Angus您似乎想进行反向查找,因此请查看支持此功能的。插入标准免责声明:过早优化是不好的,在您知道存在性能问题之前,不要使事情复杂化
让第二个反向数据结构,一个资源的hashMap,包含感兴趣的客户列表,怎么样?随着客户机和资源的变化,您需要做更多的工作,但这可能是值得的。您的结构看起来像
{client:[resource]}
但是为了高效地传递事件,您需要{resource:[client]}
您运行了探查器吗?探查器是否将其注册为真正的瓶颈
10个客户端和100个资源对于一台现代PC来说根本不算什么。简单的std::map可以非常快地完成查找。
大概是这样的:
struct Resource
{
// data 2
};
struct Client
{
// data 2
};
std::map< Client, std::vector< Resource > > mappingClientToResources;
struct资源
{
//数据2
};
结构客户端
{
//数据2
};
std::map>映射clienttoresources;
这只是一个想法,缺少了一些让它工作的东西(例如客户端的排序标准)或者您也可以将资源列表作为映射,以资源作为键,以布尔值作为值 差不多
{ client1 : { resource1 : true, resource2: true, resource3:true },... }
而不是你现在的
{ client1 : [resource1,resource2,resource3],....
查找变得更快。客户端资源链接多久更改一次,应用程序使用的内存量是否受到限制?绝对正确。如果您有性能问题,请始终首先配置文件。然后考虑解决方案。