c – 无序映射中重新计算的计数

c – 无序映射中重新计算的计数,第1张

概述评估unordered_map性能的正确方法是什么? [C 14] 在我的代码中,我使用std :: unordered_map非常广泛地按照数十亿个键的顺序.出于性能的目的,我希望知道unordered_map的行为,它必须重新散列多少次以及所有其他参数(多少个桶?在重新散列之前有多少桶空?).我知道stl提供了桶的数量.但是还需要配置什么或者您用什么来分析? 与许多std容器一样,unorde 评估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  };
总结

以上是内存溢出为你收集整理的c – 无序映射中重新计算计数全部内容,希望文章能够帮你解决c – 无序映射中重新计算的计数所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225019.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存