你好-
我们工作中有一些热衷于使用的疯子
while(true) { //Code }
在他们的代码中,不断轮询互联网以获取站点更新信息,这会导致CPU使用率达到最大。有没有人知道如何减少CPU利用率,以便其他人也可以使用该服务器。
代码本身只是在不断轮询互联网以获取站点更新信息。因此,我想一个小的睡眠方法会大大降低CPU使用率。
此外,所有操作都是在字符串对象(Java)中进行的。是否有人知道使用StringBuilder可以减少多少开销?
感谢任何指导。
你好-
我们工作中有一些热衷于使用的疯子
while(true) { //Code }
在他们的代码中,不断轮询互联网以获取站点更新信息,这会导致CPU使用率达到最大。有没有人知道如何减少CPU利用率,以便其他人也可以使用该服务器。
代码本身只是在不断轮询互联网以获取站点更新信息。因此,我想一个小的睡眠方法会大大降低CPU使用率。
此外,所有操作都是在字符串对象(Java)中进行的。是否有人知道使用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();
< p > 可能不会使其更快。这是因为Java编译器实际上将连接序列转换为对临时StringBuilder的等效追加序列。除非您在循环中连接字符串,否则最好只使用 +
运算符。这样您的代码将更易读。
另外需要指出的一点是应该使用分析工具来确定代码中可以从性能优化中获益的地方。大多数开发者有关于哪些部分值得优化的直觉并不可靠。
我先回答你的第二个问题,我同意其他人的观点,StringBuilder和String的使用取决于特定的字符串操作。我曾经进行过“基准测试”,一般来说,随着新字符串分配的数量增加(通常是连接的形式),总体执行时间会增加。我不会详细介绍,只会说在与String、StringBuffer、String.format()、MessageFormat等比较时,StringBuilder最有效。
我的经验法则是,每当我想要连接超过3个字符串时,我总是使用StringBuilder。
至于你的第一个问题。我们有一个要求将CPU使用率降低到5%。这不是一项容易的任务。我们使用Spring的AOP机制,在CPU密集型方法的任何方法执行之前添加了Thread.sleep()。仅当某些限制已被超出时,才会调用Thread.sleep()。很抱歉,这个限制的计算并不简单。更遗憾的是,我仍然没有获得发布它的许可。所以这只是为了让你进入一个有趣但复杂的轨道,而且这个方法已经被证明可以长期使用。
这些网站更新频率有多高?你可能会让主机感到非常烦恼。只需在循环结束处添加Thread.sleep(60 * 1000);
,就可以避免这种情况。这将每分钟轮询一次-肯定足够了吧?
while(true) {
//Code
Thread.sleep (1000); //Wait 1 second
}
至于第二个问题,这将减少内存使用量,并可能减少CPU使用量,但收益实际上取决于这些字符串的具体使用情况。
休眠可以降低CPU使用率。对于StringBuilders,它们可以降低内存使用量并提高性能。
你也可以尝试一下
Thread.yield()
Thread.sleep
,则可以解雇他们。wait();
进行等待。notifyAll()
方法通知该对象。
while (true)
是一种习惯用语,表示“一直执行此操作”。它本身不做任何事情;其中的代码才消耗 CPU 周期。如果其中的代码正在进行网络请求,那么在这样做时它将放弃自己的时间片,因此其他用户将获得 theirs;一个sleep()
不应显着影响整个服务器吞吐量(尽管对于被该程序攻击的服务器来说,这可能会是一个好事)。最后,StringBuilder
可能会改善性能,也可能不会。但这就是为什么存在分析器的原因:它们可以告诉您程序中花费最多时间的内容。 - kdgregory