Как получить использование памяти во времени выполнения с помощью C++?

Решение, которое вы опубликовали, работает:

[4] pry(main)> graph_nums = [1,2,3,4,5,6]
=> [1, 2, 3, 4, 5, 6]
[5] pry(main)> graph_nums.each {|x| puts "-" * x}
-
--
---
----
-----
------
=> [1, 2, 3, 4, 5, 6]

Скорее всего graph_nums - это массив строк. Вы можете преобразовать их в целые числа, используя String#to_i:

[6] pry(main)> graph_nums = ['1','2','3','4','5','6']
=> ["1", "2", "3", "4", "5", "6"]
[7] pry(main)> graph_nums.each {|x| puts "-" * x}
TypeError: no implicit conversion of String into Integer
from (pry):7:in `*'
[8] pry(main)> graph_nums.each {|x| puts "-" * x.to_i}
-
--
---
----
-----
------
=> ["1", "2", "3", "4", "5", "6"]
79
задан jww 18 May 2018 в 00:02
поделиться

6 ответов

На Linux я никогда не находил ioctl () решение. Для наших приложений мы кодировали общую обслуживающую процедуру на основе чтения файлов в /proc/pid. Существует много этих файлов, которые дают отличающиеся результаты. Вот тот, который мы обосновались (вопросом был отмеченный C++, и мы обработали ввод-вывод с помощью конструкций C++, но это должно быть легко адаптируемо к C i/o стандартные программы, если Вам нужно к):

#include <unistd.h>
#include <ios>
#include <iostream>
#include <fstream>
#include <string>

//////////////////////////////////////////////////////////////////////////////
//
// process_mem_usage(double &, double &) - takes two doubles by reference,
// attempts to read the system-dependent data for a process' virtual memory
// size and resident set size, and return the results in KB.
//
// On failure, returns 0.0, 0.0

void process_mem_usage(double& vm_usage, double& resident_set)
{
   using std::ios_base;
   using std::ifstream;
   using std::string;

   vm_usage     = 0.0;
   resident_set = 0.0;

   // 'file' stat seems to give the most reliable results
   //
   ifstream stat_stream("/proc/self/stat",ios_base::in);

   // dummy vars for leading entries in stat that we don't care about
   //
   string pid, comm, state, ppid, pgrp, session, tty_nr;
   string tpgid, flags, minflt, cminflt, majflt, cmajflt;
   string utime, stime, cutime, cstime, priority, nice;
   string O, itrealvalue, starttime;

   // the two fields we want
   //
   unsigned long vsize;
   long rss;

   stat_stream >> pid >> comm >> state >> ppid >> pgrp >> session >> tty_nr
               >> tpgid >> flags >> minflt >> cminflt >> majflt >> cmajflt
               >> utime >> stime >> cutime >> cstime >> priority >> nice
               >> O >> itrealvalue >> starttime >> vsize >> rss; // don't care about the rest

   stat_stream.close();

   long page_size_kb = sysconf(_SC_PAGE_SIZE) / 1024; // in case x86-64 is configured to use 2MB pages
   vm_usage     = vsize / 1024.0;
   resident_set = rss * page_size_kb;
}

int main()
{
   using std::cout;
   using std::endl;

   double vm, rss;
   process_mem_usage(vm, rss);
   cout << "VM: " << vm << "; RSS: " << rss << endl;
}
74
ответ дан Community 24 November 2019 в 10:12
поделиться

Старый:

maxrss указывает максимальную доступную память для процесса. 0 средств, что никакой предел не помещается на процесс. То, что Вы, вероятно, хотите, является неразделенным использованием данных ru_idrss.

Новый: кажется, что вышеупомянутое на самом деле не работает, поскольку ядро не заполняет большинство значений. То, что действительно работает, должно получить информацию от proc. Вместо того, чтобы анализировать его самостоятельно, хотя, легче использовать libproc (часть procps) следующим образом:

// getrusage.c
#include <stdio.h>
#include <proc/readproc.h>

int main() {
  struct proc_t usage;
  look_up_our_self(&usage);
  printf("usage: %lu\n", usage.vsize);
}

Компиляция с" gcc -o getrusage getrusage.c -lproc"

19
ответ дан Paul de Vrieze 24 November 2019 в 10:12
поделиться

На Linux, если можно предоставить стоимость времени выполнения (для отладки), можно использовать valgrind с инструментом горного массива:

http://valgrind.org/docs/manual/ms-manual.html

Это - тяжелый вес, но очень полезный.

9
ответ дан David Cournapeau 24 November 2019 в 10:12
поделиться

в дополнительном к Вашему пути
Вы могли назвать системную команду PS и получить использование памяти от него вывод.
или читают информацию из/proc/pid (см. структуру PIOCPSINFO)

3
ответ дан bayda 24 November 2019 в 10:12
поделиться

Я использую другой способ сделать это, и это звучит реалистично. Я получаю PID процесса с помощью функции getpid (), а затем я использую файл / proc / pid / stat. Я считаю, что 23-й столбец стат-файла - это vmsize (посмотрите на сообщение Дона). Вы можете прочитать vmsize из файла, где вам нужно в коде. Если вам интересно, сколько фрагментов кода может использовать память, вы можете прочитать этот файл один раз перед этим фрагментом и один раз после, и вы можете вычесть их друг из друга.

1
ответ дан 24 November 2019 в 10:12
поделиться

Существующие ответы лучше подходят для определения правильного значения, но я могу хотя бы объяснить, почему getrusage не работает для вас.

man 2 getrusage:

Вышеупомянутое struct [rusage] была взята из BSD 4.3 Reno. Не все поля имеют смысл в Linux. Прямо сейчас (Linux 2.4, 2.6) поддерживаются только поля ru_utime, ru_stime, ru_minflt, ru_majflt и ru_nswap.

7
ответ дан 24 November 2019 в 10:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: