对一个服务器程序想统计每秒可以处理多少数据包要如何做?答案是用处理数据包的总数除以累记处理数据包用的时间这里要指出的是 运行一段程序使用的cpu时间跟实际运行的时间是不一样的附例如下
private void ShowRunTime()
{
TimeSpan ts = ProcessGetCurrentProcess()TotalProcessorTime;
Stopwatch stw = new Stopwatch();
stwStart();
int Circles = ;
for (int i = ; i < Circles; ++i)
{
ConsoleWriteLine(iToString());
}
double Msecs = ProcessGetCurrentProcess()TotalProcessorTimeSubtract(ts)TotalMilliseconds;
stwStop();
ConsoleWriteLine(stringFormat(循环次数:{} CPU时间(毫秒)={} 实际时间(毫秒)={} Circles Msecs stwElapsedTotalMilliseconds stwElapsedTicks));
ConsoleWriteLine(stringFormat( tick = {}毫秒 stwElapsedTotalMilliseconds / stwElapsedTicks));
}
程序输出如下
循环次数: CPU时间(毫秒)= 实际时间(毫秒)=
tick = 毫秒
可以看出在这个例子中两者差距比较大其原因如下
)Windows是多任务操作系统按照线程为单位对cpu时间轮询分配即一个程序运行的中途可能被剥夺cpu资源供其他程序运行
)程序本身会有不占用cpu时间的等待过程这个等待可能是我们程序主动的比如启动一个进程然后等待进程的结束也可能是我们没有意识到的如例子的ConsoleWriteLine方法猜想其内部进行了一系列的异步I/O操作然后等待操作的完成这其间并没有占用调用进程的cpu时间但耗费了很多等待时间
总结
)性能的测量应该用程序运行时间来测量当然也需要使用cpu时间作为参考如果两者差距很大需要考虑为何出现这种情况
)Net的Stopwatch类可以精确到/毫秒基本可以满足测量精度