使用boost :: pool时CPU使用率高

时间:2019-03-06 07:17:58

标签: c++ boost memory-management

我尝试使用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占用的内存吗?

1 个答案:

答案 0 :(得分:2)

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

在所有其他条件相同的情况下,对于基本上只是要求CPU完成工作的任务,CPU使用率越高越好,因为这意味着工作将尽快完成。只要有工作要做,CPU就会以全速运行,除非它由于某种原因(例如必须等待I / O或过热)而无法运行。

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

  

我希望main1.cpp的CPU使用率会随着时间的流逝而下降,但一直保持高位直至结束。

太棒了。这意味着CPU会尽快完成工作,直到完成所有工作为止。在CPU仍有工作要做的情况下,任何低于100%的下降都仅表明存在一些效率低下的问题,导致CPU无法尽快完成工作。