如何获得ubuntu上php脚本中程序(c、c+;+;、java、python、php)的执行时间和内存使用率?
我正在尝试建立一个在线判断网站,使用php和laravel,可以判断用户提交的问题代码。服务器环境是ubuntu 每个问题都有一个输入文件和相应的输出文件,以及代码的最大执行时间限制和内存使用限制 假设,对于一个问题,输入文件是input.in,输出文件是correct.out。法官将运行用户代码并生成输出文件,并将其与correct.out进行比较,以检查解决方案是否正确。它还将检查代码是否在给定的时间限制和内存限制内运行 <>用户可以使用C、C++、java、Python或PHP 提交解决方案 我所做的: 对于C++代码,假设用户的代码是代码。我在php脚本中使用了exec(),如下所示:如何获得ubuntu上php脚本中程序(c、c+;+;、java、python、php)的执行时间和内存使用率?,php,c++,ubuntu,g++,shell-exec,Php,C++,Ubuntu,G++,Shell Exec,我正在尝试建立一个在线判断网站,使用php和laravel,可以判断用户提交的问题代码。服务器环境是ubuntu 每个问题都有一个输入文件和相应的输出文件,以及代码的最大执行时间限制和内存使用限制 假设,对于一个问题,输入文件是input.in,输出文件是correct.out。法官将运行用户代码并生成输出文件,并将其与correct.out进行比较,以检查解决方案是否正确。它还将检查代码是否在给定的时间限制和内存限制内运行 用户可以使用C、C++、java、Python或PHP 提交解决方案
exec('g++ -o code code.cpp');
这将创建一个名为“code”的可执行文件
现在,我已使用input.in文件运行可执行文件,并使用以下命令生成output.out文件:
exec('./code < input.in > output.out');
exec('./codeoutput.out');
这将提供输出文件
现在我需要知道程序执行需要多少时间,以及在代码中运行或声明变量、数组或其他数据结构需要多少内存
我可以通过计算执行的开始时间和结束时间之间的差来找到执行时间
我的问题是:
- 有没有更好的方法来确定执行时间
- 如何找到程序使用了多少内存
- 如何检查编译错误、运行时错误
- 我不认为有更好的方法可以直接测量
运行的时间exec
- 探查器是唯一的方法(
)。但是,探查器会影响性能(它会导致性能下降)。当进程仍在运行时,您可以通过以下命令检查其内存使用情况:valgrind
grep-VmPeak/proc/$PID/status
精度将非常差,对于类似于
- 您的答案是:
echo
的快速过程,您甚至没有时间运行此shell命令
g++
和/code
)以检查错误。对于g++
,关于自定义程序,它可以具有自定义逻辑并使用自己的协议来报告错误,但通常如果/code
遵循常规,它必须在错误时将退出代码设置为非零#include <iostream>
#include <cstdlib>
int main()
{
int z = 1;
int y = 1;
int x = 1 / (z - y);
return 0;
}
程序退出时代码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;
}
#包括
#包括
#包括
#包括
无效信号处理器(int signo)
{
if(signo==SIGFPE)
出口(0);
}
int main()
{
信号(SIGFPE,(*信号处理器));
intz=1;
int y=1;
int x=1/(z-y);
返回0;
}
因此,当您运行完全未知的外部代码时,几乎不可能理解它真正的功能;这就是病毒的工作原理,例如,它们的行为方式与您预期的不同。检查退出代码(从
g++
和/code
)以检查错误。对于g++
,关于自定义程序,它可以有自定义逻辑并使用自己的协议报告错误,但通常如果/code
遵循常规,它必须在错误时将退出代码设置为非零。我尝试了“$result=exec('/usr/bin/time-f”%e“/code$PID
是进程ID。请参阅此StackOverflow问题如何获取它:我获得了th$PID。但是当运行exec时('grep VmPeak/proc/$PID/status');没有这样的文件或目录。我还检查了proc文件夹,那里不存在$PID值@VitaliIth该文件夹在进程运行之前一直存在。当进程退出时,文件夹将被删除。这就是它的工作原理。所以,若应用程序运行时间较长,您可以使用此技巧在运行时测量它。唯一的选择是分析器,但它会严重影响性能。所以,在这种情况下/exec中的代码应该返回非零的退出代码,但我得到的是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;
}