Как получить время выполнения и использование памяти программы (c, c ++, java, python, php) в сценарии php на Ubuntu? - PullRequest
0 голосов
/ 19 сентября 2019

Я пытаюсь создать интернет-сайт для судей, используя php с laravel, который может судить предоставленный пользователем код для решения проблемы.Среда сервера - Ubuntu.

Каждая проблема имеет входной файл и соответствующий выходной файл, а также ограничение максимального времени выполнения и использования памяти для кода.

Предположим, для входного файла проблемы вводится.in и выходной файл правильный .out.Судья запустит код пользователя, сгенерирует выходной файл и сравнит его с correct.out, чтобы проверить правильность решения.Он также проверит, выполнялся ли код в заданный лимит времени и памяти.

Пользователи могут отправлять свои решения, используя c, c ++, java, python или php

Что я сделал:

Для кода на C ++предположим, что код пользователя - code.cpp.Я использовал exec () в своем php-скрипте следующим образом:

exec('g++ -o code code.cpp');

Это создает исполняемый файл с именем 'code'.

Теперь я запустил исполняемый файл с input.inфайл и сгенерировал файл output.out, используя:

exec('./code < input.in > output.out');

Это дает файл вывода.

Теперь мне нужно знать, сколько времени заняла программа и сколько памятион используется для запуска или объявления переменных, массивов или других структур данных внутри кода.

Я могу найти время выполнения, рассчитав разницу между временем начала и временем окончания выполнения.

Мои вопросы:

  • Есть ли лучший способ найти время выполнения?

  • Как узнать, сколько памяти использовала программа?

  • Как проверить ошибки компиляции, ошибки времени выполнения?

1 Ответ

0 голосов
/ 19 сентября 2019

Вы отвечаете:

  1. Я не думаю, что есть лучший способ, чем просто прямое измерение продолжительности exec.

  2. Профилировщик - единственный путь (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;
}

Итак, когда вы запускаете совершенно неизвестный внешний код, почти невозможно понять, что он на самом деле делает;например, так работают вирусы, они ведут себя не так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...