Высокая загрузка ЦП при использовании boost :: pool - PullRequest
0 голосов
/ 06 марта 2019

Я пытался использовать boost::pool, чтобы уменьшить потребление ресурсов ЦП для выделения памяти, но результат профилирования тестовых кодов оказался не таким, как ожидалось. Это тестовый код.

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 Использование ЦП было в два раза выше main2.cpp .
Я ожидал, что загрузка ЦП main1.cpp будет падать с течением времени, но она оставалась высокой до конца. Вопросы

  1. Не верно ли мое использование singleton_pool?
  2. Есть ли идея уменьшить потребление ресурсов процессора singleton_pool?
  3. Есть ли другие идеи по сокращению потребления ЦП при выделении памяти?

1 Ответ

2 голосов
/ 06 марта 2019

Вы думаете об использовании процессора неправильно.Если загрузка ЦП составляет менее 100%, это означает, что ресурсы ЦП тратятся впустую.Если загрузка ЦП составляет 100%, это означает, что ЦП продвигается вперед как можно быстрее.

При прочих равных условиях для задачи, которая в основном просто просит ЦП выполнить работу, чем вышеиспользование процессора тем лучше, что означает, что работа выполняется как можно быстрее.Процессор будет работать на полной скорости, пока есть работа, которую нужно выполнить, если только по какой-то причине он не может ждать ввода-вывода или перегреться - все это плохо.

Вместо этого измерьтеобщее потребление ресурсов процессора для работы.Более эффективный код потребует меньше ресурсов ЦП, чтобы выполнить эквивалентную работу.

Я ожидал, что использование ЦП main1.cpp с течением времени уменьшится, но оно оставалось высоким до конца.

Это фантастика.Это означает, что процессор выполнял работу так быстро, как мог, пока не выполнил всю работу.Любое падение ниже 100%, в то время как ЦП еще не завершен, просто указывает на некоторую неэффективность, мешающую ЦП выполнять работу настолько быстро, насколько это возможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...