降低Java程序中的CPU利用率

时间:2012-07-20 18:29:41

标签: java processor utilization

我编写了一个非常简单的Java 2D游戏,只有两个线程 - 音乐播放器和游戏。我注意到当我开始游戏时,我的CPU利用率从20%范围上升到70%范围。我在游戏中想要的很多处理工作还没有实现!

  1. 这是一个问题吗? - 不应该是一个简单的游戏没有这么多的CPU?

  2. 如果是一个问题;什么是通用编码实践或设计模式,以避免利用率的巨大飞跃(除了没有多线程)?

5 个答案:

答案 0 :(得分:3)

  

这是一个问题吗? - 不应该是一个简单的游戏不会占用太多的CPU吗?

简单地无所事事会占用整个CPU,例如:这段代码

  public static void main( String[] args ) {
    while( true ){

    }
  }

显示我的电脑上100%的CPU使用率。因此,虽然你的“简单”游戏可能不会做很多事情,但如果实施得当,它肯定会占用大量的CPU能力。

使用分析工具(如JProfiler)可以真正帮助您确定所有CPU的用途。不确定是否还有免费的分析器。但是像JConsoleVisualVM这样的免费工具(通常都包含在JDK中)也可以用来快速查看哪些Thread处于活动状态并占用大部分CPU

答案 1 :(得分:2)

  

如果是一个问题;什么是通用编码实践或设计模式,以避免利用率的巨大飞跃(除了没有多线程)?

大多数游戏引擎都有一个游戏逻辑更新功能,每秒调用60次,并且绘图功能通常被称为计算机有资源(但不超过逻辑更新)。

这里的一般编码实践是你不想更新游戏而不是你需要的。尝试在主循环中放置一个计数器,并在10秒钟内查看它被调用多少次?如果您每秒运行超过60次更新,则不需要这个CPU负担!

看起来你没有使用提供此功能的游戏引擎,所以你可以解决一个问题:让你的主while循环找到当前时间(Java的DateTime给你毫秒精度,whcih足够好了),然后将它与最后一个循环的更新时间进行比较。如果时间不够,使用Thread.sleep()可以在游戏等待下一次迭代时减轻CPU负担!

最后一条评论:

  

(除了没有多线程)

虽然拥有CPU交换机线程会导致一些开销,但我认为使用许多编写良好的线程不会让CPU更加努力(我假设工作总和与线程较少一样)。事实上,如果你的机器是多核的,那么如果有一个需要CPU的部分(假设你的线程是并发的而不是相互阻塞的话),它会让你的游戏更快地运行!

答案 2 :(得分:1)

这里的答案是测量你的程序,看看你的CPU是如何使用的。当你测量它时,你会发现一些令人惊讶的事情。市场上有许多优秀的Java分析器可以做到这一点。我使用JProfiler,我很满意。一个穷人的方法是使用pstack获取Java线程转储。采取几个转储,看看它在做什么。或者只是在IDE中调试它并在不同的点上中断它。

答案 3 :(得分:1)

找到CPU和CPU的最佳方法memoryutilization ...是使用分析器 例如jconsole或jvisualvm ..

你可以在你的jdk中找到相同的东西

  

C:〜/ jdk / bin / jconsole或C:〜/ jdk / bin / jvisualvm

CPU峰值变高的时刻需要相应的堆栈帧。 您将能够看到当前正在执行的行,其中使用了更多的CPU。

确保您对应用程序进行概要分析并对线程数进行基准测试。

答案 4 :(得分:0)

我会对您的应用程序进行CPU和内存分析,以了解它正在采取哪些措施来提高效率。