怎么测试for循环电脑运行时cpu占用高占用cpu的时间

如何用C实现让CPU占用率保持50%(例如用资源管理器查看)_百度知道
如何用C实现让CPU占用率保持50%(例如用资源管理器查看)
如何用C实现让CPU占用率保持50%(例如用资源管理器查看)如何用C实现让CPU占用率成正弦曲线
{for(i = 0;, 于是让 (2400, 而且它们的数量级还与cpu时间片分配和taskmgr波形刷新周期有关;LARGE_INTEGER start = {0};printf(&printf(&quot. 尽量不要调用system call(i&#47,000 * 2) /temp = %d\DWORD elapse = 0;的事情了;elapse = (DWORD)(((double)temp &#47, 那么我就取平均2条:#include &秒), taskmgr的cpu使用率图表是周期性刷新的;LONGLONG temp = (end, 于是想到可以构造两个相同的大busy loop., 因为它会导致很多uncontrolable的kernel time, 发现两个函数QueryPerformanceFrequency()和QueryPerformanceCounter()可以精确得到一段代码的运行时间, temp);间取10&#39, 要执行一定规模的的代码, 已经显示cpu在50%附近了;freq = %u&#92, cpu活动(执行指令)的时间和空闲(挂起)时间刚好相等的话. 先估算一个值; i &lt, 先在程序开头算出运行所需的精确时间, 几次尝试运行后就可以得到一个相对平滑的结果了;o这些privilege instruction), cpu一秒钟可以运行那个循环次.根据这个原理. 最后总结一下两个心得. 在程序运行起来后, 而在迅驰和mobile系列cpu上由于运行频率会动态改变, 那么就可以认为cpu占用率为50%.4 * 10的9次方个时钟周期每秒. 因为windows并不是一个独占的实时系统, 挂起1s, 关掉HT功能, 想要精确控制曲线几乎是不可能的:1, 关键是让循环次数和挂起时间进行匹配, 那么想显示什么波形就显示什么波形了! 在我的机器上, 如果代码执行花费的时间和挂起时间大致相等. 有了这个初步想法; int main(){int i = ;伟大&quot, 而且taskmgr的刷新率也小于1s;n&quot, 还可以让cpu波形呈现sin()函数的形式, 如果有办法用hack的方法hook入taskmgr的函数调用点; i++), 但是还有小幅度抖动.总之我实验的结果是比较粗糙, 因为我甚至连两次调用api的花费都减掉了. 为了了解taskmgr的工作原理, 波形很有可能就是呈现锯齿状的:mov dx iadd dx 1mov i dxcmp i njmp loop (很久以前学的汇编, 得到一个函数值数组;LONGLONG overhead = for(, 先达到一个峰值(大于&gt, 然后跌到一个很低的占用率.接下来是估算.;QueryPerformanceCounter(&start), 我是没有功力做这么& int main(){for(, 要使得50%的曲线更加平滑;overhead = %d&#92, 然后运行. 而且, 让cpu波形维持在50%以外的数值也不是不可能的.QuadPart - start, 就不用Sleep()函数了, 记得以前上微机原理时说现代cpu每个时钟周期可以执行2条以上的代码;Sleep(10), 1ms的话会造成线程频繁地被唤醒和挂起. 而打开内核时间的显示后可以发现;{for(i = 0, 无形中又是增加了内核时间的不确定性影响., 再进行细微调整.QuadPart. 由于抢先式多任务的争用性质;QueryPerformanceCounter(&end), freq, 而是一个抢先式多任务系统; i++).0);} 不过精确计算的结果似乎并不能得到更平滑的图像.)修改程序如下.QuadPart);n&quot, 找到两个合适的数值不是难事;for(i = 0, 最简单的方法就是写一个busy loop(也就是空循环); 9600000.h&gt. 尽量减少sleep&#47.QuadPart) * 1000.., 然后根据数组的值对busy loop中的循环数和挂起时间进行换算修改先说说我在没查阅任何资料之前的做法; 9600000:这里要先明确一点, 是因为它不需要调用任何privilege instruction(没有io操作等).QuadPart - overhead), 有了根据这个原理.3. 可以得到代码如下, 令n = 9600000; i++).; QueryPerformanceFrequency(&freq);如果能合理估算出这段代码的运行时间;printf(&} 编译.2ghz HT的cpu上;printf(& (double)freq, 发现不同的cpu得到的结果会有所不同, 尽量关闭其他应用程序, 停掉能停的服务, 等于2;n&quot, 如果频繁发生的话影响会很大, 同时还发现一个好玩的现象, 此时适当调整n的大小, overhead), 就是开了HT功能后;stdio!为了验证我的推算正确性., 我又找了几台机器试了一下, 因为内核在运行privilege instruction时我们是无法控制的, 这可谓是最简单的方法 ; i &lt, 得到ms是比较好的结果, 那么就可以知道需要挂起多长时间了. 用10ms是因为它不大也不小., 所以实现起来估算和实际情况出入比较大, 修改它的返回值.凑合一下吧)我的cpu是p4 2, 波形的抖动基本上都是由内核活动影响的, temp2), 然后根据比例放大或者缩小, 也就是说每经过一个interval期间; 0' i++), 从理论上来说是这肯定可行的, 任务管理器(taskmgr)里面显示50%并非意味着当前cpu真就工作在一半的频率下;elapse = %lf&#92. 之所以选用busy loop而不是其他api之类的; QueryPerformanceCounter(&start).4ghz, 分配给某个线程的运行时间片是会被其他更高优先级的线程抢先的., 那么从一个interval来看;}return 0, 然后调用Sleep()函数让线程挂起X(ms), 然后用它来对Sleep()函数进行赋值, 比如先对0&#39, 忘记了那个判断大小后跳转的语句怎么写了,000, 然后Sleep(1000)了事;QueryPerformanceCounter(&end), 直接写一个无限循环就可以让cpu跑在50%左右., 而Sleep(10);} return 0, 也许是过犹不及吧;;aweak的频率和花费;n&quot, 如此周而复始, 这样就不会在运行中影响内核时间; i++). 不过我们还是不能简单地将n = : 分析for(i = 0, 不过指令数一多一复杂估算的精确性就会降低, B50%), 就应该尽量减少uncontrolable的内核时间, cpu占用率正好就是50%; n.h&gt, 我查阅了一下相应的api资料;; i &lt, 那么难点就在于如何估算执行代码所花费的时间了: 在程序中首先执行一定规模的代码, 这样也可以实现某种意义上的自动化(不用估算了XD:);可以大致推算出每次循环需要5行汇编代码;LARGE_INTEGER freq = {0};区间进行取样, 如果我们让cpu工作1s; i &lt. 所以busy loop是最简单最容易估算的代码段了.2; i &lt, 也就是说, 在taskmgr里面将它的优先级设置为最高(减少争用)也可以一定程度上让波形平滑一些; 5 = (循环&#47, 就可以得到一个大致的思路:#include &Sleep(elapse), 在一个p4 3, j = 0, 表面上看就可以认为cpu的运行频率降低了(实际上没有)! 于是我尝试着降低两个数量级.(不知这个结论是不是很绝对, 仔细观察可以发现.有了上面的认识, 比如for(i = 0.QuadPart -LARGE_INTEGER end = {0}
其他类似问题
为您推荐:
资源管理器的相关知识
其他2条回答
呵呵问题相当有创意学习
用相当多的嵌套循环。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁死循环fo(;;)不断工作造成了CPU使用率100%。&请问怎样才能让CPU的占用不那么高!?????????
回复讨论(解决方案)
Sleep(****);
新开一个线程试试,在线程中来工作&
适当执行Sleep即可。
sleep(10);
死循环了,CPU如何能不高~&中间加上Sleep()延时吧
都是sleep()
1.我在想sleep&会不会影响我需要的实时性??&因为我得目的是实时监控!
2.zhucde&&请教怎么使用线程啊??&&线程的好处是什么?
“实时监控”是监控什么?
sleep自然会影响所在的线程,如果用线程死循环,也得看你是如何监控的。
“实时监控”是监控什么?
我来解读下,每毫秒甚至微妙都在监控
&监控磁盘驱动上的一切
1.&多线程对此问题无贡献,只要你有死循环,CPU总是100%,即使放到子线程也如此。楼上那位在不懂瞎说。不信自己写个子线程看看。
2.&多任务系统无法真正实现实时。人所谓的实时是指人能感知的实时,一般情况下,误差小于1妙的你是感觉不到的,因此100毫秒去检查一次,已经足够快了,根本不需要不停检查
3.&更可怕的是:你这种轮询占领了CPU,实际上对你监控的对象也是有影响的,就好像为了防止自己收细菌感染而不停喝敌敌畏,细菌还没来,你就死了。
3.&如果想“立刻”响应,你不应该通过死循环去轮训,而是要被监控对象完成操作后,尽快通知你,用回调、通知方法才是最合理的。Sleep固然可以消除高CPU问题,但是无法解决立刻响应的问题。因此楼主需要根据自己所涉及的对象,设计回调式、通知式的代码,不同系统式不一样的
比检测精度更快的实时不但是无意义的,也是不可实现的
&监控磁盘驱动上的一切
挂个文件系统过滤驱动
你只能用驱动实现,不能周期性去查询,要是你的监控软件让系统都忙死了,还有啥意义
监控不能用循环来做的
建议Sleep()
让它悬挂一会就好了
可是sys太复杂了。。。
消息或者中断比较好
创建一个内核事件,然后编写响应事件的程序。
请参照,《Windows内核编程》一书。
用不着编写驱动程序。
用死循环加sleep轮询不是Windwos系统下实时监控的思路。
用Timmer定时就可以了,如果要用一直For就民线程优先级降到最低
加个sleep(0)就可以了
13楼是正解。
for循环是根据电脑速度来的,如果某个时段电脑其他方面的事情比较多,你这里的轮询速度就会很慢,相反,你这里的占用100%CPU的循环还会占用系统其他的应用,所以,13楼的2个建议是不错的
第一,用中断代替轮询
第二,修改轮询时间,所谓的实时,你看什么行业的,很多行业的所谓的实时,其实5分钟也叫实时。用Timer多长时间一次轮询一次,这样更稳定。
13楼的话是比较有道理,&对我目前做的录屏项目比较有启发,&但是我想,&线程真的起不到作用吗?
可以控制线程运行的时间来解决占用CPU的问题
可以用事件通知的方式和达到目的嘛,这样死循环,机器再好都受不了.
Sleep或者WaitForSingleObject
13楼的话是比较有道理,&对我目前做的录屏项目比较有启发,&但是我想,&线程真的起不到作用吗?&
可以控制线程运行的时间来解决占用CPU的问题
线程是没法控制时间的。线程的优先级是在系统比较忙的时候同时请求CPU,优先级高的先进入队列,如果系统很闲,或者只有一个线程在跑,优先级是没有用的~
线程的所谓的运行时间,是在操作系统正常运行中各个线程相互抢占CPU后按照比例分配后,各个线程用了多少时间。
while(WatiForSingleObject(hThread,0)&==&WAIT_OBJECT_0)
用select函数可以创建相当精确的时钟,SELECT不止操作SOCKET,同样,文件句柄也可以操作。可以制作时钟.13楼讲的很准确.
控制了时间就达不到你“实时”监控目的了
只有让被监控对象自己通知你,才能做到实时且不占有高CPU
线程对真的占有很多CPU的操作是达不到提高性能的目的的
13楼的话是比较有道理,&对我目前做的录屏项目比较有启发,&但是我想,&线程真的起不到作用吗?&&
可以控制线程运行的时间来解决占用CPU的问题&
线程是没法控制时间的。线程的优先级是在系统比较忙的时候同时请求CPU,优先级高的先进入队列,如果系统很闲,或者只有一个线程在跑,优先级是没有用的~&
线程的所谓的运行时间,是在操作系统正常运行中各个线程相互抢占CPU后按照比例分配后,各个线程用了多少时间。Linux: 时间片 与 while 长时间占用CPU的问题
[问题点数:20分,结帖人fjlangzi]
Linux: 时间片 与 while 长时间占用CPU的问题
[问题点数:20分,结帖人fjlangzi]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2013年10月 Linux/Unix社区大版内专家分月排行榜第二2013年9月 Linux/Unix社区大版内专家分月排行榜第二
2013年12月 Linux/Unix社区大版内专家分月排行榜第三2013年11月 Linux/Unix社区大版内专家分月排行榜第三2013年6月 Linux/Unix社区大版内专家分月排行榜第三
2012年11月 Linux/Unix社区大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。while(true)循环与CPU占用率问题
一、为什么死循环占用CPU高
一个进程如果是死循环,那么占有的CPU会很高,可以操作系统时间片运行的,到了一定时间不是会自动切换到别的进程吗?既然即便是死循环,到时间还是会切换到别的进程,为什么占用CPU会高呢?
到时候的确会切换到别的进程。
可以这样理解:当切换到别的进程时,别的进程告诉系统自己没什么事情要做,不需要那么多的时间,这个时候系统就会切换到下一个进程,直到回到这个死循环的进程上,而这个进程无论什么时候都再循环,所以一直会报告有事情要做,系统就会把尽可能多的时间分给他。
实际上是这个死循环任务用光了别的进程节省下来的时间。
(虽然不是很准确,真正的进程调度实现比上面说的复杂得多,不过应该可以解释你的问题了)
二、之前写程序的时候一直没有主动注意CPU占用的问题,今天在进行RTSP服务端测试的时候发现只是接入了一两个连接,CPU的占用率已经达到了100%,吓死我了~虽然之前已经预料到CPU占用会很高,但实际测试结果还是让我出了一身冷汗,这样的程序怎么能够发布使用呢?应该逐渐关注程序性能算法优化这方面的问题。当然,导致CPU占用率如此之高的元凶就是程序中的几个while(true)死循环。
用代码解释如下:
while(true){
&& //your code
改进之后:
while(true){
&& Sleep(1);
&& //your code
}其实就是添加了一句“Sleep(1)”,但是CPU占用率就直接从100%跌到了1%左右。
Sleep()是Windows
API线程调度相关的函数,将当前线程置入等待状态,并让它等待一段指定的时间间隔(以毫秒ms为单位),零值表示放弃该线程时限的剩余部分。
Comments:CPU是以纳秒级单位运转的!
Windows98&系统是需要加上Sleep(x)函数来将控制权交割给其他进程的
至于Window的其他系列,就不大清楚如何处理
但是有一点确定,就是你的线程中加上Sleep函数,的确会减少CPU占用率,只不过牺牲程序的相应速度
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。计算机系统结构课程实验
5.2& gcciccSSE229
href="#_Toc.3& 32
href="#_Toc& 35
href="#_Toc.1& 35
href="#_Toc.2& 35
href="#_Toc.3&
MyrinetEthernet47
href="#_Toc.1& 50
href="#_Toc.2& 50
href="#_Toc.3& 50
href="#_Toc.4& 51
href="#_Toc
href="#_Toc & -20002
href="#_Toc.1& 20002
href="#_Toc.2& 2
href="#_Toc.4& 3
href="#_Toc & 14
href="#_Toc.1& 14
href="#_Toc.2& 14
href="#_Toc.3& 14
href="#_Toc & SMP26
href="#_Toc.1& 26
4.2& SMP26
href="#_Toc.3& 27
href="#_Toc.4& SMP27
href="#_Toc.5& 28
显然可以看出Myrinet由于内部是高速开关网络,因此通信开销测试曲线基本是线性的,这与以太网不同。
学习系统网通信的基本原理,学习高性能通信环境,掌握多计算机体系结构中系统网通信关键技术。
具体要求如下:
(1) Log P模型
(2) 基于Myrinet用户级通信层设计
(3) 基于以太网用户级通信层设计
改善网络层性能的最有用的手段之一就是将网络协议处理的部分功能转移到用户层空间中去,操作系统的硬件只负责允许这种受保护的用户层对网络访问。
首先需建立一套用户层通信函数库对用户程序提供类似于Socket的接口,用户可以通过这层接口收发数据。其中的一些功能必须得到操作系统核心的帮助,如建立连接,注册内存等。
其次要建立一套类似于TCP/IP的协议,其核心功能是完成收发消息,讲协议栈建立在用户层空间。这样可以避免用户层数据到核心操作系统的数据拷贝,减少一部分软件开销。
在操作系统内核层,要克服传统协议在数据发送前,操作系统总是要经过内存的虚实地址映射,在发送完成后,由于内存的释放,使下次发送需要进行相同的处理,增加了软件的开销。通过提供连接的管理和内存管理,使内存注册并一次性将注册的内存给用户使用,避免额外的软件开销。
设计用于测试TCP/IP协议上数据包的传输延迟和带宽。
设计模式分客户端和服务器端,运行时使用参数为r表示服务器,s表示客户机。
该程序产生两个数据文件,TCP-BW.TXT和TCP-LAT.TXT,分别表示带宽和延迟,
TCP-BW.TXT文件中有两列数据,分别表示字节大小(byte)和带宽Mbps,
TCP-LAT.TXT文件中有两列数据,分别表示字节大小(byte)和延迟(us)。
在linux系统下:
gcc tcp -o
ipaddr(0 for server)
pc1(192.168.241.1):
pc2(192.168.241.2):
tcp s 192.168.241.1
uname Ca SMP &&&
3.ping & &&&&&&&&
4.telnet &&&&&&&
&&&&&&&&&&&&
6TCP/IPTCP/IP}

我要回帖

更多关于 安卓 手机cpu占用测试 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信