Java减少CPU使用率

时间:2010-03-28 12:24:37

标签: java performance cpu-usage

Greets-

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

的疯子
while(true) { //Code } 

在他们的代码中。你可以想象这会最大化CPU。有没有人知道降低CPU利用率的方法,以便其他人也可以使用服务器。

代码本身只是不断地在互联网上查询网站上的更新。因此,我想一点睡眠方法会大大降低CPU使用率。

所有操作都在String对象(Java)中进行,任何人都知道StringBuilders会减少多少?#/ p>

感谢您的任何指示

9 个答案:

答案 0 :(得分:7)

很多关于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的等效序列。除非您在循环中连接字符串,否则最好只使用+运算符。您的代码将更易于阅读。

应该做的另一点是,您应该使用分析器来识别代码中可以从提高性能的工作中受益的位置。大多数开发人员对于值得优化的内容的直觉并不可靠。

答案 1 :(得分:6)

我将从你的第二个问题开始,我想同意其余的一点,StringBuilder vs String非常依赖于特定的字符串操作。我曾经“基准化”了一次,一般来说,随着新字符串分配量的增加(通常采用连接形式),总体执行时间会增加。我不打算详细说明,与String,StringBuffer,String.format(),MessageFormat相比,StringBuilder最适合加班...

我的经验法则是,每当我希望连接3个以上的字符串时,我总是使用StringBuilder。

至于你的第一个问题。我们要求将CPU使用率提高到5%。这不是一件容易的事。我们使用Spring的AOP机制在CPU密集型方法的任何方法执行之前添加Thread.sleep()。只有在超出某个限制时才会调用Thread.sleep()。我很遗憾地说这个限制的计算并不那么简单。甚至有些人说我还没有获得在网上发布的许可。所以这只是为了让你找到一条有趣但复杂的轨道,这段赛道已被证明可以长期运作。

答案 2 :(得分:4)

这些网站多久更新一次?你可能真的很讨厌主机。只需在循环结束时粘贴Thread.sleep(60 * 1000);即可避免这种情况。那将每分钟调查一次 - 当然这已经够了?

答案 3 :(得分:2)

让它等待一段时间然后再次开火,如下:

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

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

答案 4 :(得分:2)

睡眠会降低CPU使用率。至于StringBuilders,他们可以降低内存使用量并提高性能。

答案 5 :(得分:0)

您也可以尝试

Thread.yield()

答案 6 :(得分:0)

如果他们的代码位于单独的JVM中并且在Linux或其他Unix上运行,则要求他们以20秒的速度运行他们的程序。

或者您可以让它们在像VirtualBox这样的虚拟机中运行,并使用它来限制处理器利用率。

或者,如果他们继续像这样的刻录循环而不是使用某些事件驱动的模型或Thread.sleep,则可以触发它们。

答案 7 :(得分:0)

永远不要假设您在代码中看到的内容对性能有害(或不好)。性能问题众所周知具有欺骗性。

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

答案 8 :(得分:0)

  1. 代码轮询有哪些网站?做 他们支持RSS推送?
  2. 如果他们这样做,则没有必要 轮询网站,而不是插入一个 模块等待更新。然后,当前方法等待wait();
  3. 然后,新模块使用notifyAll()
  4. 通过此方法通知对象
  5. 不可否认,这是一些额外的工作,但它节省了大量的带宽和计算。