代码之家  ›  专栏  ›  技术社区  ›  Steve

Java降低CPU使用率

  •  5
  • Steve  · 技术社区  · 14 年前

    问候-

    我们在工作中有一些喜欢使用

    while(true) { //Code } 
    

    在他们的代码中。正如您所能想象的,这会使CPU最大化。有人知道如何降低CPU利用率以便其他人也可以使用服务器吗?

    代码本身只是不断地在互联网上搜索站点上的更新。因此,我想一个小的睡眠方法将大大减少CPU的使用。

    所有的操作都是在字符串对象(Java)中完成的,任何人知道有多少架构师会减少开销吗?

    谢谢你的指点

    9 回复  |  直到 11 年前
        1
  •  6
  •   Yaneeve    14 年前

    我将从您的第二个问题开始,我想同意剩下的问题,即StringBuilder和String在很大程度上依赖于特定的字符串操作。我做过一次“基准测试”,一般来说,当新的字符串分配量增加(通常以串联的形式)时,总的执行时间就增加了。我不会详细说明,只是说,与string、stringbuffer、string.format()和messageformat相比,stringbuilder是最有效的超时工作。

    我的经验法则是,每当我想将3个以上的字符串连接在一起时,总是使用StringBuilder。

    关于你的第一个问题。我们要求将CPU使用率提高到5%。这任务不容易。我们使用Spring的AOP机制在CPU密集型方法的任何方法执行之前添加一个thread.sleep()。只有在超过某个限制时,才会调用thread.sleep()。很抱歉,这个极限的计算并不是那么简单。更可悲的是,我还没有得到允许将它发布到网上。所以这只是为了让你进入一个有趣但复杂的轨道,随着时间的推移,这已经被证明是可行的。

        2
  •  7
  •   Stephen C    11 年前

    很多关于“民间智慧”的 StringBuilder 是不正确的。例如,更改此项:

    String s = s1 + ":" + s2 + ":" + s3;
    

    对此:

    StringBuilder sb = new StringBuilder(s1);
    sb.append(":");
    sb.append(s2);
    sb.append(":");
    sb.append(s3);
    String s = sb.toString();
    

    可能不会再快了 . 这是因为Java编译器实际上将级联序列转换为一个等价的附加序列到一个临时StringBuilder。除非在循环中连接字符串,否则最好只使用 + 操作员。您的代码将更易于阅读。

    另一个需要指出的问题是,您应该使用一个分析器来识别代码中可以从工作中获益的地方,从而提高性能。大多数开发人员对于什么值得优化的直觉并不那么可靠。

        3
  •  4
  •   Samir Talwar PruthviRaj Reddy    14 年前

    这些网站多久更新一次?你可能真的很烦主人。只要坚持 Thread.sleep(60 * 1000); 在循环结束时,您可以避免这种情况。一分钟一次的投票就够了吗?

        4
  •  2
  •   Nick Craver    14 年前

    让它等一段时间再开火,就像这样:

    while(true) { 
      //Code 
      Thread.sleep (1000); //Wait 1 second
    } 
    

    至于第二个问题,它也将减少内存和可能的CPU使用量,但收益实际上取决于这些字符串的情况。

        5
  •  2
  •   Darin Dimitrov    14 年前

    睡眠会降低CPU使用率。对于StringBuilder,它们可以降低内存使用率并提高性能。

        6
  •  0
  •   helpermethod    14 年前

    你也可以试试

    Thread.yield()
    
        7
  •  0
  •   Rex Kerr    14 年前

    如果他们的代码在一个单独的JVM中,并且运行在Linux或其他一些UNIX上,则需要他们在nice 20上运行他们的程序。

    或者您可以让它们在虚拟机(如virtualbox)中运行,并使用它来限制处理器利用率。

    或者,如果它们继续这样的燃烧循环,而不是使用事件驱动的模型,或者 Thread.sleep .

        8
  •  0
  •   Community Reversed Engineer    7 年前

    不要假定代码中看到的某些内容对性能来说是坏的(或好的)。性能问题是众所周知的欺骗性问题。

    Here's an easy way to see for sure what is taking the time.

        9
  •  0
  •   VGDIV    14 年前
    1. 什么站点是代码轮询?做 他们支持RSS推送?
    2. 如果他们这样做了,就没有必要 对站点进行轮询,然后插入 等待更新的模块。然后,当前方法使用 wait();
    3. 然后,新模块使用此方法通知对象 notifyAll() .
    4. 诚然,这是一些额外的工作,但它节省了大量的带宽和计算。