Вы отвечаете:
Я не думаю, что есть лучший способ, чем просто прямое измерение продолжительности exec
.
Профилировщик - единственный путь (valgrind
).Тем не менее, профилировщик будет влиять на производительность (он резко снизит ее).Пока процесс все еще выполняется, вы можете проверить использование его памяти с помощью следующей команды:
grep VmPeak /proc/$PID/status
Точность будет очень плохой, и для быстрого процесса похож на echo
вы даже можете не успеть запустить эту команду оболочки.
Проверьте коды выхода (от
g++
и
./code
), чтобы проверить ошибки.Это гарантировано для
g++
, что касается пользовательской программы, она может иметь собственную логику и использовать собственный протокол для сообщения об ошибке, но, как правило, если
./code
следует общепринятой практике, при ошибке он должен установить код выхода в ненулевое значение.
Однако, вообще говоря, не существует гарантированного способа понять, правильно ли работает программа, потому что «правильно» относится к семантике, а не к чистому кодированию.«Правильно» - это то, как автор программного обеспечения хочет, чтобы это работало.Если автор программного обеспечения считает, что программное обеспечение должно выйти с определенным кодом, он может сделать это независимо от любых внутренних ошибок.
См. Этот код, например:
#include <iostream>
#include <cstdlib>
int main()
{
int z = 1;
int y = 1;
int x = 1 / (z - y);
return 0;
}
Генерирует "деление на ноль"."исключение.
Позволяет скомпилировать и выполнить его:
$ g++ program_1.cpp -o program_1
$ ./program_1
Floating point exception (core dumped)
$ echo $?
136
Программа выходит с кодом 136
;причина в том, что по умолчанию код деления на нулевой обработчик сигнала, реализованный во время выполнения C, завершается с этим кодом.
Если мы добавим наш собственный обработчик сигнала, код выхода все равно будет 0
:
#include <iostream>
#include <cstdlib>
#include <sys/types.h>
#include <signal.h>
void signal_handler (int signo)
{
if(signo == SIGFPE)
exit(0);
}
int main()
{
signal(SIGFPE,(*signal_handler));
int z = 1;
int y = 1;
int x = 1 / (z - y);
return 0;
}
Итак, когда вы запускаете совершенно неизвестный внешний код, почти невозможно понять, что он на самом деле делает;например, так работают вирусы, они ведут себя не так, как вы ожидаете.