Trace Memory Between Points#

Synopsis#

Trace the memory charge between the execution of two pieces of code. Note that the memory must be used for it to be counted.

Results#

Results:

We are measuring Memory in units of kB.

** Start **
Mean: 0
Total: 0

** After allocation **
Mean: 1056
Total: 2112

** After deallocation **
Mean: 60
Total: 180

Code#

C++#

#include "itkMemoryProbe.h"
#include <iostream>

int
main(int argc, char * argv[])
{
  if (argc != 2)
  {
    std::cerr << "Usage:" << std::endl;
    std::cerr << argv[0] << " <Size of the array>" << std::endl;
    return EXIT_FAILURE;
  }

  const auto N = static_cast<unsigned int>(std::stoi(argv[1]));

  if (N == 0)
  {
    std::cerr << "Size of the array should be non null" << std::endl;
    return EXIT_FAILURE;
  }

  itk::MemoryProbe memoryProbe;

  memoryProbe.Start();
  std::cout << "We are measuring " << memoryProbe.GetType();
  std::cout << " in units of " << memoryProbe.GetUnit() << ".\n" << std::endl;
  memoryProbe.Stop();

  // Expect zeros here
  std::cout << "** Start **" << std::endl;
  std::cout << "Mean: " << memoryProbe.GetMean() << std::endl;
  std::cout << "Total: " << memoryProbe.GetTotal() << std::endl;
  std::cout << std::endl;

  memoryProbe.Start();
  auto * a = new char[N];
  // The memory must be used for it to be counted.
  for (unsigned int i = 0; i < N; ++i)
  {
    a[i] = static_cast<char>(i * i);
  }
  memoryProbe.Stop();

  std::cout << "** After allocation **" << std::endl;
  std::cout << "Mean: " << memoryProbe.GetMean() << std::endl;
  std::cout << "Total: " << memoryProbe.GetTotal() << std::endl;
  std::cout << std::endl;

  memoryProbe.Start();
  delete[] a;
  memoryProbe.Stop();

  std::cout << "** After deallocation **" << std::endl;
  std::cout << "Mean: " << memoryProbe.GetMean() << std::endl;
  std::cout << "Total: " << memoryProbe.GetTotal() << std::endl;

  return EXIT_SUCCESS;
}

Classes demonstrated#

class MemoryProbe : public itk::ResourceProbe<OffsetValueType, double>

Computes the memory allocated between two points in code.

This class allows the user to trace the memory charge between the execution of two pieces of code. It can be started and stopped in order to evaluate the execution over multiple passes. The values of memory are taken from GetProcessMemoryInfo() for Windows, the SMAPS file for Linux and getrusage() otherwise.

See itk::MemoryProbe for additional documentation.