首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pmr::vector比std::vector慢

pmr::vector比std::vector慢
EN

Stack Overflow用户
提问于 2021-02-22 03:41:37
回答 1查看 315关注 0票数 2

我编写了一个简单的benchmark ,看看使用pmr::vector与使用std::vector相比有什么好处。

在基准测试中,pmr::vector使用n unsynchronized_pool_resource。作为上游,也使用单调缓冲区。看一下基准测试代码

代码语言:javascript
复制
#include <iostream>
#include <memory_resource>
#include <chrono>
#include <functional>

static void pmrVector(benchmark::State& state)
{
   constexpr size_t BUF_SIZE = 2048;
   std::pmr::pool_options options;
   options.max_blocks_per_chunk = 4;
   options.largest_required_pool_block = 64;
   
    alignas(8) std::array<char,BUF_SIZE> buffer; // a small buffer on the stack
  
    //std::cout <<options.largest_required_pool_block << std::endl;
   std::pmr::monotonic_buffer_resource pool{std::data(buffer), std::size(buffer)};
  std::pmr::unsynchronized_pool_resource mem (options,&pool);
  for (auto _ : state) 
  {
    
    std::pmr::vector<char> vec{ &mem };
    for(char i = 'a'; i < 'z';++i)
    {
            
            vec.emplace_back(i);
            benchmark::DoNotOptimize(vec);
            
    }

    
  }
}
static void stdVector(benchmark::State& state)
{
   
   for (auto _ : state) 
   {
      std::vector<char> vec{};
      for(char i = 'a'; i < 'z';++i)
      {
            
            vec.emplace_back(i);
            benchmark::DoNotOptimize(vec);
            
      }
   }
}
BENCHMARK(pmrVector);
BENCHMARK(stdVector);

pmr::vector比std::vector慢3倍。与单调缓冲相比,unsynchronized_pool_resource似乎有很大的代价。看看这个基准测试benchmark monotonic buffer only

使用unsynchronized_pool_resource进行性能比较

查看仅使用单调缓冲区的性能比较

EN

回答 1

Stack Overflow用户

发布于 2021-08-02 06:24:57

你必须非常小心你正在计时的东西。我对您的测试做了一些合理的更改,我可以看到一些改进,可能主要是因为不需要使用系统范围的分配。( PMR的优势超越了这一点。)

  1. Test more elements
  2. 由于您需要测试更多的元素,请不要使用堆栈缓冲区:使用单个分配,并且不要测量它。
  3. 将重置内存资源,否则您会因为循环被重复测试而使单调资源溢出,从而滥用内存资源。

通过所有这些更改,我得到了一个更预期的结果。https://quick-bench.com/q/ylppu2cug3S25q1xGrRCGdTEjd4

代码的重要部分:

代码语言:javascript
复制
static void pmrVector(benchmark::State& state)
{
  constexpr size_t BUF_SIZE = 1000000000;
  std::pmr::pool_options options;
  options.max_blocks_per_chunk = 40;
  options.largest_required_pool_block = 640;
    
  char* buffer = new char[BUF_SIZE];
  std::pmr::monotonic_buffer_resource pool{buffer, BUF_SIZE};
  std::pmr::unsynchronized_pool_resource mem (options,&pool);
  for (auto _ : state) 
  {
    {
      std::pmr::vector<char> vec{ &mem };
      for(int i = 0; i != 100000000; ++i)
      {
            
            vec.emplace_back('a');
            benchmark::DoNotOptimize(vec);
            
      }
    }
    mem.release();
    pool.release();
  }
  delete[] buffer;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66306362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档