评估unordered_map性能的正确方法是什么? [C++ 14]
在我的代码中,我广泛使用了std::unordered_map,其顺序为数十亿个键。为了提高性能,我希望了解unordered_map的行为,即它必须重新哈希多少次以及所有其他参数(多少个存储桶?多少个存储桶在重新哈希之前为空?)。我知道STL提供了存储桶的数量。但是,还需要其他哪些资料进行分析或使用什么进行分析?
最佳答案
与许多std容器一样,unordered_map的大小必须按指数增长。确切的速率由实现定义;您可以检查实现规范或其源代码。
它如何调整大小是确定性的。如果将其包装在垫片中,则可以通过在允许增加容器的每个操作之前和之后检查bucket_count来检测这些调整大小。
您可以遍历存储桶:
template<class UnorderedMeow>
std::size_t empty_buckets( UnorderedMeow&& meow ) {
std::size_t r = 0;
auto buckets = meow.buckets_count();
for (decltype(buckets) i = 0; i < buckets; ++i)
if (meow.bucket_size(i)==0)
++r;
return r;
}
找出有多少是空的。
如果您使用基于继承的合成并覆盖仅您知道的对象,则可以添加/删除内容...
template<class Base>
struct instrumented_unordered_map:Base {
using Self = instrumented_unordered_map;
using Base::Base;
using key_type = Base::key_type; // etc
struct instrument {
Self* self;
instrument( Self* s ):self(s) {
self->start_instrument();
}
~instrument() {
self->end_instrument();
}
};
struct instrument_state {
// blah
};
instrument_state state;
void start_instrument() {
// populate state
}
void end_instrument() {
// extract from state, generate report
}
decltype(auto) operator[]( key_type const& key ) {
instrument _(this);
return Base::operator[](key);
}
// etc
};