У меня есть приложение сжатия изображений, которое теперь имеет две разные версии систем распределения памяти. В исходном файле malloc используется везде, а во втором я реализовал простой пул-распределитель, который просто выделяет кусок памяти и возвращает части этой памяти в вызовы myalloc().
Мы заметили огромные издержки памяти при использовании malloc: на высоте использования памяти для кода malloc() требуется около 170 мегабайт памяти для изображения 1920x1080x16bpp, в то время как распределитель пула выделяет всего 48 мегабайт, из которых 47 используются программой.
В терминах шаблонов распределения памяти программа выделяет большое количество 8-байтных (большинство), 32-байтных (много) и 1080-байтовых блоков (некоторые) с тестовым изображением. Помимо этого, в коде нет динамических распределений памяти.
ОС системы тестирования - Windows 7 (64 бит).
Как мы тестировали использование памяти?
С помощью пользовательского распределителя мы можем видеть, сколько памяти используется, потому что все вызовы malloc отложены на распределитель. С помощью malloc() в режиме отладки мы просто набрали код и просмотрели использование памяти в диспетчере задач. В режиме выпуска мы делали то же самое, но менее мелкозернистым, потому что компилятор оптимизировал много материала, поэтому мы не могли пройти через кусок по частям (разница в памяти между выпуском и отладкой составляла около 20 МБ, что я бы приписывал оптимизация и отсутствие отладочной информации в режиме выпуска).
Может ли malloc быть причиной таких огромных накладных расходов? Если да, то что именно вызывает это накладные расходы внутри malloc?