Блог пользователя Lord_F

Автор Lord_F, 10 лет назад, По-русски

Здравствуйте.
Как известно, решение задачи должно укладываться в определенные рамки времени работы и используемой памяти. Причем, чаще всего первое критичнее. Но не всегда.
В С++ можно следить за временем работы твоей программы, используя хотя бы clock(). А вот можно ли как-нибудь посмотреть, сколько памяти используется, проверить влезает ли программа в ML? Ну или хотя бы локально поставить такие ограничения?
Спасибо.

  • Проголосовать: нравится
  • +15
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Если мне память не изменяет, то в C/C++ портабельного способа нет.

Количество доступной памяти можно, пожалуй, замерить если в цикле выделять и освобождать всё большие куски пока malloc не вернёт NULL.

А уж попытаться замерить сколько памяти уже использовано (кроме как нахождением разности доступной памяти в начале и в конце) — это по-моему дело страшное и платформозависимое.

Но вы же сами память выделяете — что вам мешает её считать и оценивать приблизительно? С этим даже в java с грехом пополам можно справиться по-моему (хотя "песочницы" на разных сайтах почему-то очень по-разному считают результат порой). А в C/C++ всё ощутимо прозрачнее, вроде. Ну просто оцените заранее сколько дополнительной памяти расходуют stl-ные структуры которыми вы пользуетесь и из этого исходите. Кажется так.

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А средствами линукса что-нибудь можно сделать?

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится 0 Проголосовать: не нравится

      Не совсем средствами Linux, но только под Linux — попробуйте Valgrind.

      На уровне логики приложения можно попробовать перегрузку new/delete, кастомные аллокаторы.

    • »
      »
      »
      10 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      Как вариант — читать информацию о памяти из /proc/self/statm.

    • »
      »
      »
      10 лет назад, # ^ |
      Rev. 2   Проголосовать: нравится +3 Проголосовать: не нравится

      Насчет линукса: насколько я помню, можно использовать функцию getrusage(int, struct rusage *), правда, она меряет много разной памяти. В качестве первого параметра передается константа, обозначающая, для какого процесса мы заполняем структуру, указатель на которую мы передаем в качестве второго параметра.

      Пример:

      #include <sys/time.h><br>
      #include <sys/resource.h>
      
      ...
      struct rusage info;
      getrusage(RUSAGE_SELF, &info); // RUSAGE_SELF - узнать про себя
      printf("%ld KiB\n", ru_maxrss);
      ...
      

      Подробнее в манах)

  • »
    »
    10 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится
    Количество доступной памяти можно, пожалуй, замерить если в цикле выделять и освобождать всё большие куски пока malloc не вернёт NULL.

    В Linux этот способ обычно не работает, поскольку Linux позволяет "выделять" памяти сколько хочешь — настоящее выделение произойдёт только тогда, когда в новую область будет что-то записано. См. linux memory overcommit.

»
10 лет назад, # |
  Проголосовать: нравится +17 Проголосовать: не нравится

Стандартный способ — поставить в конце программы while(1); и посмотреть на реальное использование памяти процессом, запустив top под линуксом, либо в task manager (ctrl-shift-esc) под виндой.

»
10 лет назад, # |
  Проголосовать: нравится +54 Проголосовать: не нравится

В Linux есть программа GNU time, которая запускает процесс и потом выводит по нему статистику. Время работы и использованную память (максимальный RSS за время работы программы) можно получить так:

> command time -f '\nTime: %e s  Memory: %M KB' ./hello_world 
Hello World!

Time: 0.00 s  Memory: 420 KB
>

command нужен для того, чтобы обойти встроенную команду bash и вызвать именно GNU time.

»
10 лет назад, # |
  Проголосовать: нравится -8 Проголосовать: не нравится

с помощью функций sizeof можно определить сколько байтов занимает массив