免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234
最近访问板块 发新帖
楼主: HeavenTear
打印 上一主题 下一主题

怎样编程降低cpu的利用率 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-08-15 16:51 |只看该作者
我看很简单,可以直接调用函数:SetCPULimit(0.80)

论坛徽章:
0
32 [报告]
发表于 2006-08-15 17:27 |只看该作者
原帖由 isnowran 于 2006-8-15 15:07 发表

受系统精度限制,休眠最小单位是1个嘀嗒或10个嘀嗒,而一个小循环一般也就需要一个或几个嘀嗒而已,这个间隔对于循环来讲,是相当大的,这样的话就直接导致你的程序计算速度要降低一倍甚至一个数量级;


好牛啊, 兄台用的什么体系结构的计算机啊?
通常 循环总会有判断条件,执行体, x86 下怎么可能几个嘀嗒啊 
usleep 放心使用,usleep(1) 几乎感觉不到执行慢多少。 如果多线程,负载都很重, 每个都要加usleep , 最好 usleep(10) 以上。

论坛徽章:
0
33 [报告]
发表于 2006-08-15 17:50 |只看该作者
原帖由 connet 于 2006-8-15 17:27 发表


好牛啊, 兄台用的什么体系结构的计算机啊?
通常 循环总会有判断条件,执行体, x86 下怎么可能几个嘀嗒啊 
usleep 放心使用,usleep(1) 几乎感觉不到执行慢多少。 如果多线程,负载都很重, 每个都要 ...


  1. #include <fcntl.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <time.h>

  5. int main(int argc, char * argv[])
  6. {

  7.         int idel = 500;
  8.         int count = 0;

  9.         count = time( NULL );
  10.         for( int i = 0; i < idel; i++ )
  11.         {
  12.                 usleep( 10000 );
  13.         }
  14.         printf( "%i\n", time( NULL ) - count );

  15.         count = time( NULL );
  16.         for( int i = 0; i < idel; i++ )
  17.         {
  18.                 usleep( 1 );
  19.         }
  20.         printf( "%i\n", time( NULL ) - count );
  21. }
复制代码


照你的说法,usleep( 1 )应该比usleep( 10000 )快好几个数量级了,你自己试试看看,usleep( 1 )  跟 usleep( 10000 )实际耗时是一样的,说明什么?说明usleep( 1 )妄想休眠1微秒,可是系统精度达不到

论坛徽章:
0
34 [报告]
发表于 2006-08-15 18:14 |只看该作者
原帖由 isnowran 于 2006-8-15 17:50 发表


[code]
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <time.h>

int main(int argc, char * argv[])
{

        int idel = 500;
        int co ...

你这什么问题也不能说明, linux 的usleep只能10000us 以上。
若 2个线程 同时运行,他们都加 usleep(10000) 与不加 usleep 相比, 速度几乎一样, 但是对 cpu 的占用却不一样, 加上 usleep, 你别的程序可以正常操作, 不加的话,别的程序就很难抢到cpu 时间. 除非你多有程序都是全速同步运行。
任何正常的线程, 要么是异步操作,比如靠 select 等待或等信号, 要么sleep/usleep 释放 cpu
顺便说一下, time 测 500 次 usleep, 这种精度你不觉得可笑?

论坛徽章:
0
35 [报告]
发表于 2006-08-15 22:19 |只看该作者
原帖由 boer 于 2006-8-14 14:22 发表
我原先也碰到过这种事情,多线程I/O,而且是无限循环的。但程序一起来,cpu占有率达到100%,有两种方法可以:一、你使用异步i/o,例如使用select,让内核去等待信号,这样你的程序将处于高效率下;二、如果你的程 ...

这种情况下的CPU占有率达到100%,是因为系统中的其他线程几乎都处于休眠状态,系统只好把CPU时间都分配给你那个不停的忙循环的线程!只要系统中再起一个线程,那么该线程的cpu占有率就会降低!这种情况不会加重系统的负载!只不过会把分配给这个线程的cpu时间都浪费在busy loop上!

论坛徽章:
0
36 [报告]
发表于 2006-08-16 02:21 |只看该作者
原帖由 connet 于 2006-8-15 18:14 发表

你这什么问题也不能说明, linux 的usleep只能10000us 以上。
若 2个线程 同时运行,他们都加 usleep(10000) 与不加 usleep 相比, 速度几乎一样, 但是对 cpu 的占用却不一样, 加上 usleep, ...


1。兄台能在x86上找一个休眠时间少于10000毫秒的环境么?
2。cpu能占用就占用,为什么不用?若有多个进程,OS自己会调度,不会把谁饿死的,不是么?
3。time循环几次是不精确,但能看到问题的本质,即你的“usleep( 1 )或者最好 usleep( 10 )以上“的说法是无意义的,实际根本不是仅仅是休眠1个毫秒,而是一个嘀嗒。

我只是想说明一个问题,若一个程序总是在做一个循环,cpu占用率是很高,即使要控制,也要讲究策略,
不能在主要循环中用休眠这种方式控制资源占用率,本来一个嘀嗒能作1000个循环,你现在每个循环都休眠一次,cpu占用率是下来了,可程序呢,还能用么?

论坛徽章:
0
37 [报告]
发表于 2006-08-16 08:55 |只看该作者
如果你的线程用cpu是在干活,那么没有必要降低cpu的使用率,让CPU空着还不如让他干活

如果你的线程用cpu不干活,占着茅坑的话,那代码要多多优化一下。

论坛徽章:
0
38 [报告]
发表于 2006-08-16 09:18 |只看该作者
原帖由 hoyt 于 2006-8-16 08:55 发表
如果你的线程用cpu是在干活,那么没有必要降低cpu的使用率,让CPU空着还不如让他干活

如果你的线程用cpu不干活,占着茅坑的话,那代码要多多优化一下。


99% 的情况下, 开线程是为了多任务协作,而不是为了提高CPU使用率。

论坛徽章:
0
39 [报告]
发表于 2006-08-16 11:04 |只看该作者
消除轮询的忙等待,多使用信号量,select

论坛徽章:
0
40 [报告]
发表于 2006-08-16 11:32 |只看该作者
IO能让CPU负担加重?恐怕是设计的问题吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP