我编写了一个简单的benchmark ,看看使用pmr::vector与使用std::vector相比有什么好处。
在基准测试中,pmr::vector使用n unsynchronized_pool_resource。作为上游,也使用单调缓冲区。看一下基准测试代码
#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进行性能比较

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

发布于 2021-08-02 06:24:57
你必须非常小心你正在计时的东西。我对您的测试做了一些合理的更改,我可以看到一些改进,可能主要是因为不需要使用系统范围的分配。( PMR的优势超越了这一点。)
通过所有这些更改,我得到了一个更预期的结果。https://quick-bench.com/q/ylppu2cug3S25q1xGrRCGdTEjd4

代码的重要部分:
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;
}https://stackoverflow.com/questions/66306362
复制相似问题