我尝试使用boost::pool
来减少CPU的内存分配消耗,但是性能分析测试代码的结果与预期的不同。
这是测试代码。
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使用率会随着时间的流逝而下降,但一直保持高位直至结束。
问题是
答案 0 :(得分:2)
您正在考虑CPU使用错误。如果CPU使用率小于100%,则意味着CPU上的资源正在浪费。如果CPU使用率为100%,则表示CPU正在尽可能快地进行前进。
在所有其他条件相同的情况下,对于基本上只是要求CPU完成工作的任务,CPU使用率越高越好,因为这意味着工作将尽快完成。只要有工作要做,CPU就会以全速运行,除非它由于某种原因(例如必须等待I / O或过热)而无法运行。
相反,请测量工作的总CPU消耗。效率更高的代码将需要更少的CPU来完成等效的工作。
我希望main1.cpp的CPU使用率会随着时间的流逝而下降,但一直保持高位直至结束。
太棒了。这意味着CPU会尽快完成工作,直到完成所有工作为止。在CPU仍有工作要做的情况下,任何低于100%的下降都仅表明存在一些效率低下的问题,导致CPU无法尽快完成工作。