Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 30
×

Виділення пам’яті в програмі

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Зацікавила тема виділення пам’яті в программі різними методaми:

1. new () /delete — с++

2. malloc/free — c

Розмір пам’ятті для виділення був одинаковий. 500 мб.

Тестування проводилось на кількох комп’ютерах з різними типами памяті (ddr2, ddr3) і різною частотою пам’яті.

Виділення пам’яті першим методом з використання new () /delete на компютерах з більш швидкою пам’яттю дало в 2 рази гірші результати ніж на комп’ютерах з менш швидкою пам’яттю. Тип пам’яти був однаковий — ddr3 лише швидкодія інша.

Виділення памяті другим методом з використанням malloc/free дало більш менш очікувані результати. На компютерах з більш швидкодіючою пам’яттю час виділення памяті був менший в 2 рази ніж на компютерах з меншою швидкодією пам’яті.

На компютері з більш швидкою пам’яттю другий метод виділення пам’яті показав результат в 5 раз кращий ніж перший метод. Аналогічно швидкодія збільшилась і на компі з менш швидкою пам’яттю але лише у 2 рази в порівнянні з першим методом.

Назріває питання. Чому?

PS: Компілятор — ms visual studio 2005

При використанні компілятора від intel, і компілюванні программи під конкретний процесор результати відрізнялись в 3 рази.

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Alex_CPM2
new [N] выдает выровненную память? не фейл ли? ,
а если я его переопределил?

может строчку из стандарта запостите?

предназначена для контроллирования объектов чтобы вы могли перегружать функции своих созданных классов-объектов.

LOL

С/С++, не рекомендую её использовать под громадные объекты возможность не уследить выделенный блок памяти при этом хранящиеся узлы под выделением других объектов возможность потеря указателя и потом опять дебаггер.

после этих строк системность вашего программирования под большим вопросом...

все ваши указатели указывают на виртуальные адреса, а не на топовое железо

а виртуальная память наверное на самом деле хранится у бога за пазухой...

привилегия выполнения программ в пользовательском режиме память-2^16 в режиме ядра все-2^32 — это для 32 — разрядных систем.

еще один лулз... вы точно программист? познания как у похапешника причитавшего про микрроядра в википедии...

Змішались в кучу коні, люди...

так это текст на русском.,

а что там в коде...

Синдром непризнанного гения...

Я от думав, що написати у відповідь.
Такий потік свідомості.
Така «сбиваюча з ног струя мислі».
Ні крапок, ні ком.
Змішались в кучу коні, люди...
Видно автор писав на одному диханні, мабуть, наболіло.
Короче, приєднують до тріма.

А заодно йду зроблю собі лунапарк з блекдеком і шлюхами мікроядро з диспечером і пріоритетним шедулером.

Что за бред вообще, new/delete — отличается тем что она в run-time библиотеки при компоновки указанные параметры в функции new [N] — выравнивает размер под тип данных который указан операндом (или объектом) автоматически избавляя от этого программиста и предназначена для контроллирования объектов чтобы вы могли перегружать функции своих созданных классов-объектов. malloc/calloc/realloc/free — использовалась в С для их использования не просто указать типа еденицу элемента в размер операнда если этого массив количество элементов умножьте на размер операнда и так далее, остались для совместимости, я как системный программист — С/С++, не рекомендую её использовать под громадные объекты возможность не уследить выделенный блок памяти при этом хранящиеся узлы под выделением других объектов возможность потеря указателя и потом опять дебаггер. И что Вы тут болтаете про железо, вы вообще физические адреса оперативки тут не используйте, все ваши указатели указывают на виртуальные адреса, а не на топовое железо, почитайте про диспетчер виртуальной памяти и запомните каждый работающий процесс имеет свои копии кучи, стека, блоки, только библиотеки режима ядра такие как kernel, user, gdi32, advapi и так далее. и вы тут не мудрите, про процессы исполняющие знаете защищённый режим, привилегия выполнения программ в пользовательском режиме память-2^16 в режиме ядра все-2^32 — это для 32 — разрядных систем. Кто тут болтает свою операционную систему создать (ответе мне чем микроядерные системы отличаются от монолитных), зачем болтать если близко даже не можете что-то сказать, мой совет если в простом не можете разобраться, вообще тогда вообще зачем изучать C/C++.

Пасиб всем, особенно юджину и флайману, буду рыть.

Тільки не розумію, навіщо воно тобі, і ембедери готуєшся, чи як?

Я просто хочу знать. Знания лишними не бывают, не? В ембеддеры пока не собираюсь, таки нет того багажа знаний.

память читается линиями по 32−512 байт за раз. дорого только первое обращение к линии которой нет в кеше, а также любое обращение к линии, которую делят между собой процессоры... обращение к данным в L1 1−3 такта, L2 — до 10, кеш промах это больше 100 (иногда сильно больше)...
процессор понимает паттерны обращения к памяти, то есть если читать из массива последовательно вперед или назад, то память будет прекешироваться даже без использования специальных команд.
DDR2 от DDR3 отличается пропускной способностью шины, то есть временем за которое загрузится 1 линия в кеш, ни malloc ни new не зависят от типа памяти, так как их задача найти и пометить блок занятым.
если топикастер хочет мерять скорость помяти, то есть очень простой способ это сделать...
берется очень большой массив (не меньше десятка мб), заполняется данными, чтоб за всеми адресами были закреплены страницы.
читаем из массива каждый первый байт, меряем время,
потом каждый второй байт, меряем
каждый 4, 8, 16, 32, 64, 128...
вычисляем средние времена доступа, строим график, потом повторяем с записью

на этом графике будет видет размер линии, так как при его достижении увеличится количество кешпромахов и возрастет среднее время доступа...

Я теж можу помилятись (так як не С++ гуру) але щось мені говорить, що new / delete викликають конструктор/деструктор об"єкта, а конструкторів може буди цілий зоопарк: від того що по замовчуванні, конструкторів які беруть до уваги всяке наслідування об"єктів і їх віртуальність, і явно описаних розробником.


поскольку С и С++ есть обертки над Ассемблером,
то их опции
1. new () /delete — с++

2. malloc/free — c

Я конечно могу ошибаться, но new это всего лишь враппер над malloc, а пратические действия все равно выполняються аллокатором, который у них общий.

мона ссылку на ман? А то у меня такое чувство, что я в терминологии путаюсь.

Нет конкретного мана. Хотя бы потому, что нет общего решения. На разных архитектурах, и даже на разных поколениях одной архитектуры все может сильно отличаться.
Но идеологически: минимальный квант данных для х86 — 1 байт, определяется регистрами процессора. В память данные пишутся по всей ширине шины, при этом каждому байту соответсвует сигнал валидности и он выставляется для каждого модифицируемого байта. Т.е. делается аппаратное маскирование. Если надо изменить меньше чем байт, то делается опреция read-modify-wright, т.е. маскирование уже софтварное.
По старым канонам, для лучшего быстродействия надо было размещать данные по четным адресам для 16-разрядных архитектур и по кратным 4-м для 32-разрядных.
На сегодня для того чтобы оптимизировать работу с памятью, в контроллере памяти накапливается несколько обращений которые выставляются на шине в порядке минимизируещем оверхед. Например для последовательных адресов делается burst-mode выставление — одного адреса и запись/считывание данных с автоинкрементом.
Причем все эти фичи как раз и составляют know-how «нового высокопроизводительного чипсета», поэтому стандартизации не подлежат.
Базовые концепции: en.wikipedia.org/...mory_controller

en.wikipedia.org/...ki/Dual_Channel

Юджин/флайман, мона ссылку на ман? А то у меня такое чувство, что я в терминологии путаюсь.

навіть не знаю що порадити почитати, бо то збиралось потрохи з мануалів, форумів, васного досвіду
сбробуй погуглити — pragma packed — memory caching, — memory layers implementations: L1, L2, L3 — memory management unit — allocation memory: heap vs stack — bit mask
Тільки не розумію, навіщо воно тобі, і ембедери готуєшся, чи як?
У мене на одній із останніх співбесід на сінйора програміста по телефону просили описати як працює MMU в АRM.
Я навіть розгубився, чи то люди задали адекватне питання, чи по приколу.
Чесно сказав, що не знаю.
На 2к не взяли, співбесіду провалив.

Отаке життя ембедера.

Думаю что железо тут особо не причем, т.к. оно ничего не знает о свободной или занятой памяти. Занятая память — это абстракция на уровне ОС

думаю аналогично.
выделением памяти рулит ОС.
поскольку С и С++ есть обертки над Ассемблером,
то их опции
1. new () /delete — с++
2. malloc/free — c
реализованы на нем.
и рассуждать что работает быстрее-медленнее подобно спору «что быстрее срабатывает: чекбокс или радиобаттон? »

как только Хеллип с Плохишом еще пинков тут не надавали. работают перед НГ, аврал наверно.

Думаю что железо тут особо не причем, т.к. оно ничего не знает о свободной или занятой памяти. Занятая память — это абстракция на уровне ОС или user space менеджера памяти программы.
Кмк бит выделить нельзя потому что так написали логику памяти ОС и прочих glibc и языков программирования. При желании можно написать свои ОС и/или язык программирования со своей логикой указателей и менеджером памяти в котором можно будет адрессовать и выделять отдельные биты, но это делать не рационально, так как все таки железо оперирует как минимум байтами (шины, регистры процессора и т.д.), да и мало кому нужно.

Но я больше «формошлеп», поэтому могу и ошибаться.

По теме сказать нечего? Внезапно, странно, что я, неоднократно указывав на то, что не эмбеддер, не знаю, как оно в железе работает, мой вопрос, однако, намекает, что нзать сие хочу, не? Или базы с некоторых пор по новой специальности приобретаюдца во снах, а не в книгах, манах и форумах?

И этот человек тут на форуме постоянно поет про формошлеперов и необходимость начинания с основ...

Сказано же — как и чар — маскированием, потому что шина логически 32-разрядная, а физически м.б. и совсем другой размерности.

Юджин/флайман, мона ссылку на ман? А то у меня такое чувство, что я в терминологии путаюсь.

ты лучше меряй скорость доступа к этой самой памяти, и цену кешпромаха...

new и malloc имеют весьма посредственное отношение к скорости доступа, их задача записать в свои структуры что блок такого-то размера занят...

А именно чисто 1 бит, так, чтобы в памяти был зарезервирован 1 бит? Мона так?

Сказано же — как и чар — маскированием, потому что шина логически 32-разрядная, а физически м.б. и совсем другой размерности.

Вот здесь вот и ответ ТСу — система процессор-память живет настолько своей жизнью, что прогнозировать что-то бесполезно. Тут играет роль и размер кеша, и политика кеширования, и отношение размера кеша к размеру всей памяти (некоторые области могут не кешироваться), и сам код (который может исполняться с в совсем другом порядке, чем написан) итд итп.

Я так понимаю ты о блочности выделения, нет? А именно чисто 1 бит, так, чтобы в памяти был зарезервирован 1 бит? Мона так?

Муха, а возможно вотще выделять память в 1 бит?

Майже так само як і чар (байт) на 32 бітній шині даних.

Оффтоп:

Муха, а возможно вотще выделять память в 1 бит? Разве не блоком память выделяедца, который явно не 1 бит? Мне просто интересно, т.к.я не силен в сиим вопросе.

Тому що цей тип найменшого розміру.

Спробуй побітно виділяти пам"ять.

Тому що цей тип найменшого розміру.

Ще таке зауваження, а чому виділяються блоки чарів, а не інтів.


Має бути все однакове.
Тобто має бути один той самий проц, шина і т.д.

Тоді мініяються планки з пам"яттю та і частоти шини/проца/ререша пам"яті

Нажаль таких умов створити не можемо!

Спасибо что выложили исходники, я их скомпилировал и получил результаты, аналогичные вашим.

Ги, а не спадало на думку, що крім виділення пам"яті може відбуватись її кешування, а може ще своп на диск.

Спадало. Але ж не може результат повторятись кілька разів один і той же, щоправда з дельтою в десяті секунд.

Та й цікаво взагалі що швидше працює, і чому плюси програють при виділенні пам’яті.

Суть тесту була — яка оперативка краща, і чи є ефект від більш швидкодіючої і дорогої оперативки.

А в чом суть теста:
Хто скоріше, new чи malloc?

Чи хто ліпше виділяє С чи С++?


clock_t startTotal, finishTotal;
	double* statTest = new double[nCount];
	clock_t statTestStart, statTestFinish;
	double** statIter = new double*[nCount];
	clock_t statIterStart, statIterFinish;

m_Progress.SetRange32( 0, nCount );

startTotal = clock();

for( int test = 0; test != nCount; ++test ){

statIter[test] = new double[nIter];

statTestStart = clock();
		char** pBlockArray = new char*[nIter];
		for( int i = 0; i != nIter; ++i ){
			statIterStart =  clock();

pBlockArray[i] = new char[nBlock];

statIterFinish = clock();

statIter[test][i] = statIterFinish - statIterStart;
		}

for( int i = 0; i != nIter; ++i ){
			for( int j = 0; j != nBlock; ++j){
				pBlockArray[i][j] = _T('1');
			}
		}

for( int i = 0; i != nIter; ++i ){
			delete[] pBlockArray[i];
		}

delete[] pBlockArray;
		statTestFinish = clock();
		statTest[test] = statTestFinish - statTestStart;

m_Progress.StepIt();
		m_Progress.Invalidate(TRUE);
	}

finishTotal = clock();

......//вывод данных

for( int i = 0; i != nCount; ++i )
		delete[]statIter[i];

delete[]statTest;
	delete[]statIter;

Ги, а не спадало на думку, що крім виділення пам"яті може відбуватись її кешування, а може ще своп на диск.

Тест поганий тим, що:

проводилось на кількох комп’ютерах з різними типами памяті (ddr2, ddr3) і різною частотою пам’яті.

Має бути все однакове.
Тобто має бути один той самий проц, шина і т.д.

Тоді мініяються планки з пам"яттю та і частоти шини/проца/ререша пам"яті

а что ты хотел протестировать?
>> При виділенні пам’яті також відбувалось її заповнення.
сам заполнял? или компилил дебаг в которо автоматом память заполняется?
1. вообщем тест бесмысленый. у этой памяти очень большая вероятность уйти в своп.

2. для обработки больших обьемов данных, память не так выделяют — эфективный способ это использовать мемори мапед файлы.

Покажите исходники теста

Подивися асм файли (створені після компіляції).

При виділенні пам’яті також відбувалось її заповнення.

Підписатись на коментарі