Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 02.11.2018
Сообщений: 1

Свой менеджер памяти и тормоза в list

02.11.2018, 22:11. Показов 833. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил вспомнить с++ и сделать простейший memory manager.
Казалось, все просто, при запросе выделяется блок, его запоминаем в list.
Но когда посмотрел тайминг - ужаснулся, по сравнению со стандартным malloc медленнее в 10 раз!
Оказалось, что тормозит как раз список - его итераторы.
Можете подсказать, чем его заменить?

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <list>
#include <vector>
#include <malloc.h>
#include <stdlib.h>
#include <chrono>
 
 
using std::cout;
using std::list;
 
 
class MemManager
{
    struct MemChain
    {
        unsigned shift;     // смещение от начала 
        unsigned size;
        char free;      // занят - 0, свободен - 1
    };
 
    list <MemChain> List;
    char * Mem=NULL;
    unsigned totalSize=0;
public:
    MemManager(unsigned _size) {
        Mem = (char*) malloc(_size); 
        if (Mem == NULL) throw "error allocating mem"; 
        totalSize = _size;
        MemChain ch;
        ch.shift = 0;
        ch.free = 1;
        ch.size = totalSize;
        List.push_front(ch);
    }
 
    ~MemManager() {
        if (Mem!=NULL) free(Mem); 
    }
 
    void * alloc(unsigned size) {
//      if (есть память)
        {
            auto ch=List.begin();
            for (; ch != List.end();ch++) if (ch->free == 1 && ch->size>=size) break;
            if (ch != List.end())
            {                       // выделим из данного блока нужный кусок и вставим в список ссылку на оставшуюся свободную часть 
                MemChain ch1;       // остаток
                ch1.shift = ch->shift+size;
                ch1.free = 1;
                ch1.size = ch->size - size;
                ch->size = size;
                ch->free = 0;
                auto ptr = ch;
                ptr++;
                List.insert(ptr,ch1);
 
                return (Mem + ch->shift);
            }
        }
        return NULL;
    }
    void  free(void*ptr) {
        if (ptr<Mem && ptr>Mem + totalSize) throw "wrong adr";
        auto ch = List.begin();
        for (; ch != List.end(); ch++) if (Mem + ch->shift == ptr) {
            ch->free = 1;
            break;
        }
    }
    unsigned maxSize() {};
 
    void GarbCol() 
    {
        // сборщик мусора
        auto ch = List.begin(),pr=ch;
        for (int c = 0; ch != List.end(); ch++)
        {
            if (ch->free == 1)
            {
                c++;
                if (c == 2) // предыдущий был тоже свободный
                {
                    pr->size += ch->size;
                    List.erase(ch);
                    c = 1;
                    ch = pr;
                    continue;
                }
            }
            else c = 0;
            pr = ch;
        }
    };
 
    void Print(const char * str) {
        cout << str << "\n";
        for (auto ch = List.begin(); ch != List.end(); ch++) cout << ch->shift << "    " << ch->size << "    " << ch->free << "\n";
    }
 
};
 
const unsigned Len = 1024 * 100;
const unsigned Count = 200;
 
int main()
{
    MemManager mm(Len*sizeof(int));
    std::vector<int *> pointers;
    pointers.reserve(Count);
    mm.Print("begin");
    std::chrono::time_point<std::chrono::high_resolution_clock> p1=std::chrono::high_resolution_clock::now(),p2,p3;
 
    for (int i = 0; i < Count; i++)
    {
        int * ptr = (int*)mm.alloc(Len / Count * sizeof(int));
        pointers.push_back(ptr);
    }
    p2 = std::chrono::high_resolution_clock::now();
    std::cout << std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1> >>(p2 - p1).count() << "\n";
    
    for (int i = 0; i < Count; i++)
    {
        mm.free(pointers[i]);
    }
    p3=std::chrono::high_resolution_clock::now();
 
    std::cout << std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1> >>(p3 - p2).count() << "\n";
    return 1;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.11.2018, 22:11
Ответы с готовыми решениями:

Выделить в памяти 1024 ячейки по 8 байт и вывести их адреса(МИНИ менеджер памяти))
Вот тут появилась такая интересная задача: требуется сделать программу которая управляет 1024 ячейками памяти по 8 байт каждая. т.е. за...

Свой менеджер БД
Здравствуйте! Есть база данных (сейчас в Excel) на 40000 строк, 15 столбцов. Хочу реализовать какой-нибудь удобный менеджер данной БД. С...

Тормоза при высокой частоте оперативной памяти (3200)
Доброго времени суток. Собрал себе систему на базе AMD. железо: Asrock X370 Taichi AMD Ryzen 7 1700X Zotac GTX 1060-6GB SSD WD...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2018, 22:11
Помогаю со студенческими работами здесь

Менеджер памяти
Доброго времени суток. Столкнулся с такой проблемой... Необходимо написать эмулятор менеджера памяти, т.е. создать какой нибудь...

Менеджер памяти
Пишу менеджер памяти и возник вопрос насчет реализации free. Как бы из функции убить переданный указатель ? то есть занулить его......

Менеджер памяти
Хочу написать свои аналоги malloc free. Загвоздка в том, что я не знаю как освобождать потом память, ведь VirtualFree не может освободить...

Написать свой List<T>
Как создать собственный класс списка? Т.е. вот есть список List&lt;T&gt;, если пишу List&lt;string&gt; l = new List&lt;string&gt;(), то создается...

DLL и менеджер памяти
Добрый день. Написал библиотеку на XE6, в которой подключаюсь к веб-сервису и возвращаю record. В проекте на Delphi2006 подключаю эту...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru