我在做一个JudgeOnline(在线评判系统),就是程序设计大赛中用的在线提交系统,接收用户的代码输入,然后在服务器端执行编译,并用标准数据运行编译生成的可执行程序,然后将输出结果与标准输出比较.编译模块我已经写好.现在就是评判模块中,怎样获取该进程的占用内存及运行时间的问题.
我知道C#中有Process这个类,并且有Process.WorkingSet64以及TotalProcessorTime属性.可是执行出来的结果却相当奇怪.我的代码如下:
int runtime,memory;
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/C "+workPath + _pid.ToString() +
".exe <" + probPath + _pid.ToString() + ".in >" + workPath +
_pid.ToString() + ".out &&exit";
p.StartInfo.CreateNoWindow = true;
//workPath为工作路径,_pid.ToString()+".exe"是要调用的可执行程序的路径.
//"<"+_pid.ToString()+".in"是输入文 件
//"> " +workPath +_pid.ToString()+".out &&exit", 是将输出结果导出到_pid.ToString()+".out"文件中,并退出cmd.exe.
//比如: a.exe < C:\\a.in > C:\\a.out
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
while(!p.HasExited)
{
p.Refresh();
memory = (int)(p.WorkingSet64 >> 10);
runtime = p.UserProcessorTime.Millisecon
ds;
Thread.Sleep(15);
}
然后我写了一个测试文件
#include <stdio.h>
int main()
{
int i,j;
for(i=0;i<1000000;i++)
for(j=0;j<100;j++);
return 0;
}
执行结果是占用内存1800K左右(这个结果正常),运行时间0ms.----这个地方不正常,我单独地测过这个程序,至少要运行400ms以上,可是这里却用了0ms的时间.
我又写了另外一个测试文件
int main()
{
int i,j;
scanf("%d%d",&i,&j);
printf("%d",i+j);
return 0;
}
这个时候内存又不正常了.这个程序一般占内存是在40~60K,可是程序的执行结果是占用了1600K的内存!
我不知道是不是我程序写的有问题还是怎么的,或者有人知道更好的方法来获取一个程序占用的内存与时间吗?恳请各位指点.谢谢.