我自定义使用std :: unordered_map的性能非常慢

问题描述 投票:2回答:1

我正在尝试在unordered_map中存储图的某些信息。每个边都有一些参数。有120条边,每个边有90 * 2个不同的参数。

我具有[std::unordered_map<>的以下实现

typedef std::tuple<int, int, int, int> metric_tuple_key; // metric  tuple key


// define a hash function for this metric_tuple_key tuple
struct m_KeyHash : public std::unary_function<metric_tuple_key, std::size_t> {
        std::size_t operator()(const metric_tuple_key& k) const {
            // the magic operation below makes collisions less likely than just the standard XOR
            std::size_t seed = std::hash<int>()(std::get<0>(k));
            seed ^= std::hash<char>()(std::get<1>(k)) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
            seed ^= std::hash<char>()(std::get<2>(k)) + 0x9e3779b97f4a7c15 + (seed << 6) + (seed >> 2);
            return seed ^ (std::hash<char>()(std::get<3>(k)) + 0x9e3779b9 + (seed << 6) + (seed >> 2));
        }
    };

// define the comparison operator for this  metric_tuple_key tuple
struct m_KeyEqual : public std::binary_function<metric_tuple_key, metric_tuple_key, bool> {
        bool operator()(const metric_tuple_key& v0, const metric_tuple_key& v1) const {
            return (std::get<0>(v0) == std::get<0>(v1) && std::get<1>(v0) == std::get<1>(v1) &&
                    std::get<2>(v0) == std::get<2>(v1) && std::get<3>(v0) == std::get<3>(v1));
        }
    };

std::unordered_map<metric_tuple_key, double, m_KeyHash, m_KeyEqual>           _metrics;

通过创建元组键,我能够将值插入_metrics

现在,我想在指定键时从_metrics中获取一些值。

//Retrieve around 120  double values. Total number of entries in _metrics is 21600
double k = _metrics.at((std::make_tuple(m, k, edge.first, edge.second))). //do this 120 times

这非常慢(将近400毫秒)。我希望大约需要一毫秒或更短的时间。

我做错了什么还是std :: unordered_map不适合我的用例。我之前使用过python字典来解决相同的问题,并且在python字典中值的检索几乎是瞬时的]

编辑:一些unordered_map统计信息:

 max_load_factor: 1

 size: 21600

 bucket_count: 25717

 load_factor: 0.839911
python c++ unordered-map
1个回答
0
投票

搜索持续时间取决于您哈希的质量。为了进行测试,您可以使用“地图”-它具有稳定的搜索持续时间。如果地图比无序地图快-您的哈希值错误。

© www.soinside.com 2019 - 2024. All rights reserved.