程序之前都运行良好,最近发现CPU利用率一直不稳定,从0-100都有,也不太好测试,所以请教大家看看

解决方案 »

  1.   

    目测你的代码用了多线程,多线程里用了while死循环,死循环里有判断,if的时候没问题,else的时候没处理(没加sleep)
    结果就相当于while(true){}这东西,不吃CPU才怪
      

  2.   

    每个线程里面我都用到了sleep的
      

  3.   

    在觉得可能有问题的地方加日志  多从日志分析  自己写一个检测CPU的  网上找一下 一大堆
      

  4.   

    没有工具能直接检测出哪个函数占用的CPU高。
      

  5.   

    每个线程里面我都用到了sleep的
    去掉Sleep,估计你的cpu就降下来了神马情况,你需要不断的Sleep呢?
      

  6.   

    代码有木有死循环?
    有木有io操作没有close?
      

  7.   

    每个线程里面我都用到了sleep的
    去掉Sleep,估计你的cpu就降下来了神马情况,你需要不断的Sleep呢?
    去掉sleep,不就变成while(true)死循环了吗
    所以不是去掉sleep,而是去掉死循环才对
      

  8.   

    sleep和waitone效果差不多,它就是让当前线程让出CPU,直到够时间了才让CPU继续执行它,所以它本身不会引发CPU高
      

  9.   

    每个线程里面我都用到了sleep的
    去掉Sleep,估计你的cpu就降下来了神马情况,你需要不断的Sleep呢?
    去掉sleep,不就变成while(true)死循环了吗
    所以不是去掉sleep,而是去掉死循环才对
    我是说撸主的代码为什么都要Sleep?
      

  10.   

    企业版vs就可以实现这个功能,分析-性能向导-cpu采样
      

  11.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
      

  12.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
      

  13.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
      

  14.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
      

  15.   

    没有这样的函数,不过你可以自己写统计方法,记录函数执行的时间(Sleep时不能计算在内)
      

  16.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
      

  17.   

    visual studio 的调试里有一个“性能和诊断”的功能,可以调试哪个函数点用CPU较多,还有其他很多调试功能
      

  18.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
    你说这句话之前,自己测试下?
      

  19.   

    很明显你的CPU是双核的,你在一个线程里死循环,最多只能到50%
    你开2个线程死循环不sleep试试
      

  20.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
    你说这句话之前,自己测试下?

    你在循环体内加上Thread.Sleep(1);再看下占用率再说吧  
    如果你觉得只是循环输出字符串就要占用50%的CPU很正常 那也没什么好再讨论的了
      

  21.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
    你说这句话之前,自己测试下?

    你在循环体内加上Thread.Sleep(1);再看下占用率再说吧  
    如果你觉得只是循环输出字符串就要占用50%的CPU很正常 那也没什么好再讨论的了如果你觉得只是循环输出字符串就要占用50%的CPU很正常 那也没什么好再讨论的了 你想多了!我的机器不止运行着一个控制台程序!
      

  22.   

    把console.writeline去掉了再试
    这是跟显卡进行交互了,CPU可比显卡快的多了,都是CPU在等显卡
      

  23.   

    很明显你的CPU是双核的,你在一个线程里死循环,最多只能到50%
    你开2个线程死循环不sleep试试
    首先,我哪个截图,是针对#19的回复!我不否认,死循环会吃cpu!
      

  24.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
    你说这句话之前,自己测试下?

    你在循环体内加上Thread.Sleep(1);再看下占用率再说吧  
    如果你觉得只是循环输出字符串就要占用50%的CPU很正常 那也没什么好再讨论的了我并没有否认死循环会吃CPU截图是对你19#while(true)循环不用sleep肯定是CPU满载的  这个观点的不认同,仅此而已。
    一个死循环不至于让CPU满载
      

  25.   

    非要在这绕过问题钻空子也是够了
    你要不要把你那个死循环放到单核CPU上试试?
    是你一开始说Sleep会造成高CPU占用 这点你能举个实例来?
      

  26.   

    非要在这绕过问题钻空子也是够了
    你要不要把你那个死循环放到单核CPU上试试?
    是你一开始说Sleep会造成高CPU占用 这点你能举个实例来?
    针对这个例子
    增加sleep肯定占用的cpu更低,有了sleep,cpu不是一直为它服务。去掉sleep,cpu就降下来了。我上面7#说的,谬论其实我是想表达,撸主的代码为什么一直sleep。
      

  27.   

    线程都用的死循环,当然就得都加sleep
    这事我也常干
    比如就是开10个线程去不断的采集PLC的信号(有发有收,用同步while循环比用异步逻辑上简单的多)
    while(true)里面if判断不行麽?
    while(true)
    {
    if(isRunning){}
    }
    这个跟吃CPU没有关系,怕就怕if里正常处理通信不吃CPU,而如果不走if就变成while死循环而且没有sleep,那就超级吃CPU
    我说的是while循环可以不用sleep,和吃不吃cpu不搭噶
    while(true)循环不用sleep肯定是CPU满载的 
    你说这句话之前,自己测试下?

    你在循环体内加上Thread.Sleep(1);再看下占用率再说吧  
    如果你觉得只是循环输出字符串就要占用50%的CPU很正常 那也没什么好再讨论的了我并没有否认死循环会吃CPU截图是对你19#while(true)循环不用sleep肯定是CPU满载的  这个观点的不认同,仅此而已。
    一个死循环不至于让CPU满载不是百分之百那是因为你的CPU是双核4线程的, 而且在windows环境下一个线程最多运行20ms就会被强行让位子。
      

  28.   

    感谢大家的回答,我已经找到原因了,是这样的,我的程序中有一个List,里面有30多W的数据,我程序中又FOR循环,比如这样
    for(int i=0;i<300;j++){
        int id = 去30多W的List中查找出结果;}如果程序中就一个线程那么是不怎么占CPU的,如果有几十个线程,我程序中大概30个左右吧,每一个里面都有一个FOR循环,FOR循环的次数几十到300,500左右,这样一跑起来CPU就异常的高,双CPU还能扛,单CPU没有办法看,主要原因就是那个LIST,里面数据太多了,去掉那一块就好了,LIST里面的数据少也不会占CPU的,程序里面没有死循环