C#测量程序运行时间及cpu使用时间实例方法
private void ShowRunTime()
{
TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessorTime;
Stopwatch stw = new Stopwatch();
stw.Start();
int Circles = ;
for (int i = ; i < Circles; ++i)
{
}
double Msecs = Process.GetCurrentProcess().TotalProcessorTime.Subtract(ts1).TotalMilliseconds;
stw.Stop();
Console.WriteLine(string.Format("循环次数:{0} CPU时间(毫秒)={1} 实际时间(毫秒)={2}", Circles, Msecs, stw.Elapsed.TotalMilliseconds, stw.ElapsedTicks));
Console.WriteLine(string.Format("1 tick = {0}毫秒", stw.Elapsed.TotalMilliseconds / stw.Elapsed.Ticks));
}
程序输出如下:
循环次数:1000 CPU时间(毫秒)=50.072 实际时间(毫秒)=666.9071
1 tick = 0.0001毫秒
可以看出在这个例子中,两者差距比较大,其原因如下:
1)Windows是多任务操作系统,按照线程为单位对cpu时间轮询分配。即一个程序运行的中途,可能被剥夺cpu资源,供其他程序运行。
2)程序本身会有不占用cpu时间的等待过程。这个等待可能是我们程序主动的,比如启动一个进程,然后等待进程的结束;也可能是我们没有意识到的,如例子 的Console.WriteLine方法,猜想其内部进行了一系列的异步I/O操作然后等待操作的完成,这其间并没有占用调用进程的cpu时间,但耗费 了很多等待时间。
总结:
1)性能的测量,应该用程序运行时间来测量,当然也需要使用cpu时间作为参考,如果两者差距很大,需要考虑为何出现这种情况。
2).Net的Stopwatch类可以精确到1/10000毫秒,基本可以满足测量精度。
个人整理:
Elapsed和ElapsedMilliseconds属性在被调用时,会在内部调用kernel32中的QueryPerformanceFrequency()函数以获取处理器支持的高精度计时器的频率,随后用这个数字对获取的时间差值进行修正,最后Elapsed属性会返回一个新的TimeSpan对象。而获取ElapsedTicks属性时则不会进行这种高精度的计算(修正)。但是一般来说这两者的误差并不是很大。如果需要精确计算时间或是测试数据量特别大的情况下,推荐使用Elapsed和ElapsedMilliseconds属性。
存在疑问:
我测试之后发现并没有像如下所说的结论,我已经回复原作者,暂未得到答复。希望知道原因的朋友指明下。谢谢。
从内部实现来看,StopWatch.IsHighresolution = true时,StopWatch.Elapsed.Ticks应该等于StopWatch.ElapsedTicks再乘以frequency(频率的常量)。反之,这2个数在IsRunning为true时,应该是相等的。所以照理应该是StopWatch.Elapsed.Ticks会比较大。
C#测量程序运行时间及cpu使用时间实例方法的更多相关文章
- C#测量程序运行时间及cpu使用时间
转载:http://www.cnblogs.com/yanpeng/archive/2008/10/15/1943369.html 对一个服务器程序想统计每秒可以处理多少数据包,要如何做?答案是用处理 ...
- C#实现测量程序运行时间及cpu使用时间
private void ShowRunTime() { TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessorTime; Stopwatc ...
- C# 测试程序运行时间和cpu使用时间
方法一 Stopwatch类测试程序运行时间和cpu使用时间 添加命名空间using System.Diagnostics;使用实例如下 private Stopwatch sw = new Stop ...
- C# 测量程序运行时间
using System.Diagnostics; Stopwatch watch = new Stopwatch(); watch.Start(); /* 需要测量运行时间的程序 */ watch. ...
- 测量C++程序运行时间
有个很奇怪的现象,我自认为写得好的文章阅读量只有一百多,随手写的却有一千多--要么是胡搞,要么是比较浅显.纵观博客园里众多阅读过万的文章,若非绝世之作,则必为介绍入门级知识的短文.为了让我的十八线博客 ...
- [daily]使用rdtsc指令,测量程序的运行速度 [转]
原文地址:http://blog.chinaunix.net/uid-24774106-id-2779245.html 最近搞架构,一直在讨论.听人提到,自行科普了一下,先转发,mark.有机会深入学 ...
- C/C++下测量函数运行时间
C/C++下测量函数运行时间 time.h介绍 C/C++中的计时函数是clock(),而与其相关的数据类型是clock_t. clock_t clock( void ); 这个函数返回从" ...
- VC++程序运行时间测试函数
0:介绍 我们在衡量一个函数运行时间,或者判断一个算法的时间效率,或者在程序中我们需要一个定时器,定时执行一个特定的操作,比如在多媒体中,比如在游戏中等,都会用到时间函数.还比如我们通过记录函数或者算 ...
- C++程序运行时间-ZZ
[15.5.25]贴一段实用的代码,linux下跑过. #include <stdio.h> /* printf */ #include <time.h> /* clock_t ...
随机推荐
- css3的过滤效果
上面的图片就是css3新特性的滤镜效果,学会了这些那么我们这群爱美爱帅的大web是不是就可以完美的用代码实现照片美化了捏~~ 好,咱们先把照片后面的白框实现, <style> #div1{ ...
- yii处理cookie
/** * 设置用户cookie会话 */ public function setCookie() { //set loginName $cookies = Yii::app()->reques ...
- 精通css学习记录
#字体 * 无衬线字体(Sans-serif):Helvetica,Arial,'Lucida Family',Verdana,Tohoma,'Trebuchet MS' * 有衬线字体(Serif ...
- VFS(Virtual File System)
一.VFS作为内核子系统,为用户空间程序提供了文件系统相关的接口.所有实际文件系统依赖VFS共存,依靠VFS系统工作. 1.VFS提供通用文件系统接口:用户空间程序可以利用标准的UNIX文件系统调用, ...
- Java中类的定义
成员变量:对应事物的属性 成员方法:对应事物的行为 类定义的格式 定义类:就是定义类的成员,包括成员变量和成员方法 成员变量:和以前定义变量几乎是一样的.只不过位置发生了改变.在类中,方法外. 成员方 ...
- word2016如何英汉互译
1.如果是一篇英文文档且是pdf格式,可以用word2016打开直接转化成了word,就算不是会员也可以的,在此附上16版的光盘安装包,可以百度自行下载 (链接:https://pan.baidu.c ...
- [网络流24题] 太空飞行计划问题 (最大流->最大权闭合图)
洛谷传送门 LOJ传送门 做这道题之前建议先看这篇论文,虽然论文里很多地方用了很多术语,但hbt神犇讲得很明白 这篇题解更加偏向于感性理解 把问题放到二分图上,左侧一列点是实验,权值为$p[i]$,右 ...
- 02springMVC理解DispatcherServlet
DispatcherServlet的作用 DispatcherServlet在Web.xml中的配置 上下文关系 DispatcherServlet初始化顺序 DispatcherServlet中使用 ...
- 可序列化serializable的作用是什么
什么情况下需要序列化:a)当你想把的内存中的对象写入到硬盘的时候:b)当你想用套接字在网络上传送对象的时候: 为什么要序列化: 为了将对象可以以流的方式传输到其他位置,就必须要将该对象定义为可序列化的 ...
- Spring自带字符编码过滤器
http://blog.csdn.net/youngage/article/details/51356821 http://blog.csdn.net/daelly/article/details/5 ...