c++ - 使用 boost::pool 时 CPU 使用率高
问题描述
我尝试使用boost::pool
来减少内存分配的 CPU 消耗,但 profiling 测试代码结果不如预期。这是测试代码。
main1.cpp
#include "pool_singleton.h"
int main()
{
const int size = 400000;
for (int i = 0; i < 100000; ++i)
{
auto obj = pNew uint8_t[size]; // use singleton_pool
pDelete(obj, size);
}
return 0;
}
main2.cpp
#include "pool_singleton.h"
int main()
{
const int size = 400000;
for (int i = 0; i < 100000; ++i)
{
auto obj = new uint8_t[size];
delete[] obj;
}
return 0;
}
pool_singleton.h
#pragma once
#include <iostream>
#include <memory>
// boost
#include <boost/pool/singleton_pool.hpp>
struct pNewTag{};
typedef boost::singleton_pool<pNewTag, 1> pool;
inline void* operator new (size_t size, int num)
{
auto ptr = pool::ordered_malloc(size);
return ptr;
}
template<int N>
struct memMan
{
static memMan<N> x;
inline static void delete_ptr(void *p, size_t size)
{
pool::free(p, size);
}
static inline void pool_destroy()
{
pool::purge_memory();
}
};
template<int N>
memMan<N> memMan<N>::x;
#define pNew new(1)
#define pDelete(p, size) memMan<0>::delete_ptr(p, size)
#define purge memMan<0>::pool_destroy()
main1.cpp的 CPU 使用率是main2.cpp的两倍。
我预计main1.cpp的 CPU 使用率会随着时间的推移而下降,但直到最后它仍然很高。问题是
- 我的 singleton_pool 使用错误吗?
- 有什么想法可以减少singleton_pool的cpu消耗吗?
- 还有其他想法可以减少内存分配的 CPU 消耗吗?
解决方案
您正在考虑错误的 CPU 使用率。如果 CPU 使用率低于 100%,则意味着 CPU 上的资源正在被浪费。如果 CPU 使用率为 100%,这意味着 CPU 正在尽可能快地向前推进。
在所有其他条件相同的情况下,对于基本上只是要求 CPU 完成工作的任务,CPU 使用率越高越好,因为这意味着工作会尽快完成。只要有工作要做,CPU 就会全速运行,除非由于某些原因(例如必须等待 I/O 或过热)而无法运行——所有这些都是坏事。
相反,测量工作的总 CPU 消耗。更高效的代码将需要更少的 CPU 来完成等效的工作。
我预计 main1.cpp 的 CPU 使用率会随着时间的推移而下降,但直到最后它仍然很高。
这真是太好了。这意味着 CPU 会尽可能快地完成工作,直到完成所有工作。当 CPU 仍有工作要做时,任何低于 100% 的下降都表明效率低下,从而阻止了 CPU 尽可能快地完成工作。