Если бы я реализовал три алгоритма сортировки на С++, а затем хотел бы изучить их сложность пространства/объем оперативной памяти, которую они занимают. Как я мог это сделать? Существуют ли какие-либо стандартные или сторонние библиотеки, которые я могу использовать?
Как исследовать пространственную сложность алгоритмов сортировки?
Ответы (2)
Это под Unix/Linux? Если это так, вы можете вычислить разницу между значениями, возвращаемыми sbrk(0) в начале и в конце вашей программы. Это даст общий объем кучи памяти во время выполнения.
См. страницу руководства на sbrk(2). "Вызов sbrk() с приращением 0 можно использовать для поиска текущего местоположения прерывания программы."
(дополнение) Используя игрушечную программу на C++, которая просто выделяет один большой вектор, оказывается, что среда выполнения GNU C++ имеет тенденцию выделять очень большие объекты, используя mmap(), а не sbrk().
Использование strace:
$ strace ./vec1.x |& grep map
...
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4ac2b42000
mmap(NULL, 800002048, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f4a93051000
...
$
Вы также можете выполнить grep с помощью brk вместо map.
Использование Валгринд:
$ valgrind ./sbrk1.x
...
==22223== total heap usage: 3 allocs, 3 frees, 800,073,728 bytes allocated
....
$
Надеюсь, поможет !
0
- person Felix Rosén; 31.05.2019
Если вы хотите изучить их сложность - как асимптотическую функцию - вы не сможете сделать это эмпирически, например. путем перехвата выделений и освобождений. Вам нужно будет получить асимптотические границы максимального объема выделенного пространства, тщательно проанализировав свой код. Автоматизировать эту задачу в общем случае теоретически невозможно, так как ваша программа может быть сколь угодно сложной.
На практике я предлагаю вам попытаться организовать ваши выделения и отмены распределения так, чтобы они не происходили спонтанно повсюду. Это должно помочь вам ограничить максимальную выделенную сумму.
В той степени, в которой вы просите программный инструмент для измерения выделенной суммы во время запуска, это не относится к теме StackOverflow, и вам следует спросить на softwarerecs.stackexchange.com.