使用boost :: pool时使用高CPU

High CPU usage on using boost::pool

本文关键字:CPU boost pool 使用      更新时间:2023-10-16

我试图使用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使用情况会随着时间的流逝而下降,但它一直保持很高直到结束。问题是

  1. 我的singleton_pool使用错误?
  2. 有没有想法减少singleton_pool的CPU消耗?
  3. 还有其他想法可以减少CPU消耗内存分配吗?

您正在考虑错误使用CPU。如果CPU使用率少于100%,则意味着CPU上的资源正在浪费。如果CPU使用率为100%,则意味着CPU尽可能快地进步。

所有其他事情都是平等的,因为基本上要求CPU进行工作的任务越高,CPU使用越高,这意味着工作正在尽快完成。CPU只要有某种原因就不能出于某种原因(例如必须等待I/O或过热),CPU将全速运行。

相反,请测量工作的总CPU消耗。更有效的代码将需要更少的CPU才能完成等效工作。

我希望Main1.cpp的CPU使用时间会随着时间的流逝而下降,但是直到结束。

太棒了。这意味着CPU尽可能快地完成工作,直到完成所有工作。在CPU仍然有工作要做的情况下,任何跌至100%以下的下降都只是表明有些效率低下,阻止CPU尽快完成工作。