Я реализую FineList и LazyList занятия в C ++. Оба вышеупомянутых параллельных связанных списка были реализованы на Java в книге «Искусство многопроцессорного программирования«Я хотел бы измерить объем памяти, потребляемый каждым алгоритмом в течение всего процесса его выполнения. Я не уверен, как мне это сделать. Я мог бы просто отслеживать количество раз»новый«вызывается каждым потоком в счетчике в обоих алгоритмах и использует его в качестве критерия измерения. Точно так же всякий раз, когда поток вызывает»удалять«Я бы уменьшил счетчик. Это справедливый критерий для измерения потребления памяти? Проблема в том, что алгоритм FineList позволяет мне немедленно» удалить «узел, как только он будет удален из связанного списка, из-за того, что основанный на замке характер. Но это не так в алгоритме LazyList, так как он имеет методы без блокировки. Есть ли другой способ измерить потребление памяти, или вышеуказанный метод справедлив для обоих алгоритмов?
Если вы ведете заказанный журнал new
а также delete
звонки (включая запрашиваемый размер), и вы уверены, что интересующий вас код использует только new
а также delete
а не другие процедуры распределения, вы можете определить более или менее теоретический потребление памяти в любой момент времени за счет непрерывного подсчета избытка памяти, выделенной на свободную память. Вы могли бы, возможно, создать такой журнал, перегружая глобальный operator new(size_t)
а также удалить.
Номер будет только теоретический из-за нескольких факторов:
Это просто царапает поверхность.
C ++ позволяет вам предоставить свой собственный operator new
и соответствие operator delete
, Это полезно для таких задач измерения. Вы даже можете использовать это, чтобы выяснить, какая память используется как функция стратегии распределения, например, Посмотрите, сколько памяти требуется вашему алгоритму при округлении выделения до числа, кратного 16 байтам.
Большим преимуществом этого подхода является то, что вам не нужно трогать код самого алгоритма. Вы можете использовать бухгалтерский учет вашего собственного распределителя.
Имейте в виду, идея программирования без блокировки может быть чрезмерно оптимистичной, если вам действительно нужно new
, В C ++ нет никаких гарантий, что new
без блокировки. А так как C ++ позволяет вам new
память в один поток и delete
это в другом, необходима некоторая межпоточная синхронизация.