C#测量程序运行时间及cpu使用时间
转载:http://www.cnblogs.com/yanpeng/archive/2008/10/15/1943369.html
对一个服务器程序想统计每秒可以处理多少数据包,要如何做?答案是用处理数据包的总数,除以累记处理数据包用的时间。这里要指出的是, 运行一段程序,使用的cpu时间,跟实际运行的时间是不一样的。附例如下:
1: private void ShowRunTime()2: {3: TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessorTime;4: Stopwatch stw = new Stopwatch();5: stw.Start();6: int Circles = 1000;7: for (int i = 0; i < Circles; ++i)8: {9: Console.WriteLine(i.ToString());10: }11: double Msecs = Process.GetCurrentProcess().TotalProcessorTime.Subtract(ts1).TotalMilliseconds;12: stw.Stop();13: Console.WriteLine(string.Format("循环次数:{0} CPU时间(毫秒)={1} 实际时间(毫秒)={2}", Circles, Msecs, stw.Elapsed.TotalMilliseconds, stw.ElapsedTicks));14: Console.WriteLine(string.Format("1 tick = {0}毫秒", stw.Elapsed.TotalMilliseconds / stw.Elapsed.Ticks));15: }16:
程序输出如下:
循环次数: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使用时间实例方法
private void ShowRunTime() { TimeSpan ts1 = Process.GetCurrentProcess().TotalProcessorTime; Stopwatc ...
- 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 ...
随机推荐
- MVC中的扩展点(六)ActionResult
ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为 ...
- C# 中判断程序是否启动使用Mutex使用异常
[背景] 在最近的一个项目中,我负责客户端模块的工作.需求要求,在启动客户端时需要判断客户端是否已经启动(单例).于是我决定使用Mutex来实现此功能,代码如下: bool initiallyOwne ...
- The Shortest Path in Nya Graph
Problem Description This is a very easy problem, your task is just calculate el camino mas corto en ...
- [CODEVS1258]关路灯
题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯.开始时 ...
- linux中grep和egrep的用法
1. grep简介 grep (global search regular expression_r(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大 ...
- 群赛 ZOJ3741(dp) ZOJ3911(线段树)
zoj3741 简单dp.wa了两个小时,中间改了好多细节.后来还是不对,参考了别人的代码,发现一个致命问题,初始化的时候,不是每种状态都能直接达到的.初始化成-1. (题目有个小坑,0<=L& ...
- poj 1438--One-way Traffic(边的双连通)
给定一个图,并给定边,a b c(c==1||c==2) 表示ab之间有c条边 求把尽可能多的有向边定向变成强联通图. 先把图当做无向图,加边时记录是否有边,dfs的时候不要把本没有的边用到!因为这个 ...
- PC-信使服务之不用聊天软件也能通信
net send 192.168.1.2 OK 二台电脑都要开启messenger服务.
- 为Android安装BusyBox
大家是否有过这样的经历,在命令行里输入adb shell,然后使用命令操作你的手机或模拟器,但是那些命令都是常见Linux命令的阉割缩水版,用起来很不爽.是否想过在 Android上使用较完整的she ...
- 理解screenX clientX pageX概念
先了解screenX,clientX,pageX概念 screenX: 鼠标位置相对于用户屏幕水平偏移量,而screenY就是垂直方向的,此时的参照点也就是原点是屏幕的左上角. clientX: 跟s ...