Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::pool时CPU使用率高_C++_Boost_Memory Management - Fatal编程技术网

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

C++ 使用boost::pool时CPU使用率高,c++,boost,memory-management,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

我试图使用
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;
}
#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”
int main()
{
const int size=400000;
对于(int i=0;i<100000;++i)
{
auto obj=pnewuint8\u t[size];//使用单例池
pDelete(对象,大小);
}
返回0;
}
main2.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;
}
#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”
int main()
{
const int size=400000;
对于(int i=0;i<100000;++i)
{
自动对象=新单元8_t[尺寸];
删除[]obj;
}
返回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()
#pragma一次
#包括
#包括
//促进
#包括
结构pNewTag{};
typedef boost::singleton_pool;
内联void*运算符新建(大小\u t大小,整数)
{
自动ptr=池::有序的\u malloc(大小);
返回ptr;
}
模板
结构记忆
{
静态memmanx;
内联静态无效删除ptr(无效*p,大小\U t大小)
{
池::自由(p,大小);
}
静态内联无效池_destroy()
{
池::清除内存();
}
};
模板
memMan:x;
#定义pNew new(1)
#定义pDelete(p,size)memMan::delete_ptr(p,size)
#定义purge memMan::pool_destroy()
main1.cpp的CPU使用率是main2.cpp的两倍
我预计,main1.cpp的CPU使用率会随着时间的推移而下降,但直到年底它仍然很高。 问题是

  • 我的单人池使用错了吗
  • 有什么办法可以减少单例池的cpu消耗吗
  • 有没有其他方法可以减少内存分配的CPU消耗

  • 您认为CPU使用率是错误的。如果CPU使用率低于100%,则意味着CPU上的资源被浪费。如果CPU使用率为100%,则表示CPU正在尽可能快地向前推进

    在所有其他条件相同的情况下,对于一个基本上只是要求CPU做工作的任务,CPU使用率越高越好,因为这意味着工作完成得越快。只要有工作要做,CPU就会全速运行,除非它因为某些原因不能全速运行,比如必须等待I/O或过热——这都是坏事

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

    我预计main1.cpp的CPU使用率会随着时间的推移而下降,但直到最后它仍然很高


    那太棒了。这意味着CPU正在尽可能快地完成工作,直到它完成了所有的工作。当CPU仍有工作要做时,任何低于100%的下降都表明CPU效率低下,无法尽可能快地完成工作。

    您认为CPU的使用是错误的。如果CPU使用率低于100%,则意味着CPU上的资源被浪费。如果CPU使用率为100%,则表示CPU正在尽可能快地向前推进

    在所有其他条件相同的情况下,对于一个基本上只是要求CPU做工作的任务,CPU使用率越高越好,因为这意味着工作完成得越快。只要有工作要做,CPU就会全速运行,除非它因为某些原因不能全速运行,比如必须等待I/O或过热——这都是坏事

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

    我预计main1.cpp的CPU使用率会随着时间的推移而下降,但直到最后它仍然很高


    那太棒了。这意味着CPU正在尽可能快地完成工作,直到它完成了所有的工作。当CPU仍有工作要做时,任何低于100%的下降都表明CPU效率低下,无法尽可能快地完成工作。

    为什么要订购\u malloc?为什么要输出i?写入stdout不会影响您的基准测试。
    我预计main2.cpp的CPU使用率会随着时间的推移而下降,但它一直很高,直到最后
    您是指main1吗?我使用
    ordered_malloc
    分配数组。有没有办法不使用
    订购的\u malloc
    ?输出i只是检查语句。我忘了擦。结果是,
    main1.cpp
    main2.cpp
    的CPU负载更高。
    我预计main2.cpp的CPU使用率会随着时间的推移而下降,但一直保持高水平,直到最后你是说main1吗是。谢谢你指出这一点。你为什么希望CPU使用率下降?为什么CPU不能尽可能快地完成工作?在这两种情况下,你都给了CPU大量的工作要做,而且没有任何东西可以阻止它完成这些工作,为什么CPU的运行速度会比它能够运行的速度慢呢?为什么命令_malloc?为什么要输出i?写入stdout不会影响您的基准测试。
    我预计main2.cpp的CPU使用率会随着时间的推移而下降,但它一直很高,直到最后
    您是指main1吗?我使用
    ordered_malloc
    分配数组。有没有办法不使用
    订购的\u malloc
    ?输出i只是检查语句。我忘了擦。结果是,
    main1.cpp
    main2.cpp
    的CPU负载更高。
    我预计main2.cpp的CPU使用率会随着时间的推移而下降,但一直保持高水平,直到最后你是说main1吗是。谢谢你指出这一点。你为什么希望CPU使用率下降?为什么CPU不能尽可能快地完成工作?在这两种情况下,你都给了CPU大量的工作要做,而且没有任何东西可以阻止它完成这些工作,为什么CPU的运行速度会比它能够运行的速度慢呢?