【问题标题】:Why Boost unordered_map takes too much time on 1st insertion?为什么 Boost unordered_map 在第一次插入时需要太多时间?
【发布时间】:2017-08-24 06:03:53
【问题描述】:

我正在用 C++ 开发一个对延迟敏感的应用程序。有一个模块,我正在使用 boost::unordered_map。 在将第一个条目插入地图时,我遇到了太多延迟,之后所有条目都有不错的插入时间。

如果我使用 std::unordered_map 而不是 boost::unordered_map 这种行为不会发生。在这种情况下,第一次插入也需要几百纳秒(100~200)。

以下是我注意到的一些时间统计数据: - 地图中的第一次插入:大约 12 微秒(10 ~ 12 微秒) - 之后几乎所有的插入:200 纳秒(大约)

这里是示例代码:

struct timespec _timeSpec ;

long getTimerTime()
{
  clock_gettime(CLOCK_REALTIME, &_timeSpec);
  return ( 1000000000 * _timeSpec.tv_sec ) +  _timeSpec.tv_nsec;
}

int main()
{
  int i = 0;

  boost::unordered_map < uint64_t , std::pair < uint64_t , bool > > _turnAroundTime ;

  while( ++i != 10 )
  {
    uint64_t t1 = getTimerTime() ;

    _turnAroundTime[i] = std::make_pair ( i, true );

    uint64_t t2 = getTimerTime() ;

    std::cout << "Latency : " << t2 - t1 << std::endl;
  }

  return 0 ;
}

【问题讨论】:

  • 您有问题吗?
  • 是否都插入到同一个存储桶中?
  • 在创建地图之后使用地图之前调用'reserve(N)`方法。
  • @juanchopanza :是的,问题是,为什么会有这样的行为?如果我使用 std::unordered_map 则找不到此类行为。
  • @bhavuksamrat 您应该编辑 问题 以提及这一点。

标签: c++ c++11 boost hashmap low-latency


【解决方案1】:

这是您程序中的第一个堆分配。程序的其余部分由非常少量的堆分配组成。

第一次堆分配可能需要向操作系统请求一页内存,该内存页会被重复使用直到用尽。这样的请求可能需要比本地堆使用更长的时间。

这是一个理论。要确定究竟是什么需要时间,请分析一下。

如果这个理论是正确的,那么以后的分配将需要更长的时间,因为需要更多的操作系统页面。并且仔细使用分配器和边界图大小可以使其不会发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2021-04-30
    • 1970-01-01
    • 2015-12-22
    • 2019-01-28
    • 1970-01-01
    • 2018-04-07
    相关资源
    最近更新 更多