【问题标题】:Why is my java code only using about 20% of CPU when there is no GUI为什么没有 GUI 时我的 java 代码只使用大约 20% 的 CPU
【发布时间】:2013-08-29 22:45:39
【问题描述】:

我正在做一个有两个版本的 java 程序:一个有 GUI,一个没有。

我对 GUI 感到满意,因为它一直使用 100% 的 CPU,但没有的(应该更快)只使用 5-25% 的 CPU。两个版本在计算方面完全相同。当我从 Eclipse 和 shell 运行时,也会出现同样的问题。

我曾考虑使用 -Xms 和 -Xmx 分配更多内存,但这不会改变 CPU 使用率。

我还尝试在终端中将优先级设置为 nice 我的进程为 -15,但没有明显差异。

如何在 Eclipse 和终端中确保我的代码拥有 100% 的 CPU。

【问题讨论】:

  • 让你的应用程序多线程。

标签: java eclipse shell console


【解决方案1】:

100% CPU 利用率是个问题,而不是目标。

通常,尽管我确信有例外情况,但人们会看到程序在 100% 的 CPU 使用率上停滞不前,这表明存在错误。

这样做的原因是,每当您的进程使用外围组件时,程序都会等待组件返回,而在进程等待时,它会将控制权传递给其他进程。在这种情况下,外围设备包括 RAM 之类的东西。

因此,一个单线程程序保持 100% 的 CPU 使用率意味着它循环执行指令,但从未触及非常有限的资源集。特别是您的程序不会接触 RAM,在 java 中这意味着您的程序不进行函数调用。 - 所以可能你的程序卡住了。

多线程程序要复杂得多,因为程序可以将控制权传递给同一程序的其他部分。

最终,您应该考虑的问题是; GUI 程序是否比非 GUI 程序更快地完成任务?如果确实如此,那么有理由研究为什么会这样,并且很可能这些原因归结为并行处理*。如果 GUI 使用的时间比非 GUI 多,那么在比较 GUI 程序和非 GUI 程序时,低 CPU 使用率是一个额外的好处。

*编辑添加:并发处理的编程是一个巨大的复杂性。在走这条路之前,请确保潜在的好处是值得的。

【讨论】:

  • 感谢您的澄清。这是真的,除非您在服务器上进行数学模拟并且如果您希望它们以最快的速度完成;)
  • 即使有大量的数学模拟,除非您编写的程序非常强调内存的管理方式,否则您不会期望 100% 的 CPU 使用率。 - 这种级别的内存使用控制在 java 中根本不可用,这是你为了类型安全和垃圾收集而放弃的东西。
  • @Taemyr 从他所说的所有内容来看,他确实在编写异常,并且他确实需要最大限度地利用 CPU,尤其是考虑到问题的原因.. == 100 或 ~= 100 尚无定论
【解决方案2】:

我看到了两种可能性

  1. 您确定它受 CPU 限制吗?在那里放一个无限循环,看看它是否尖峰。

  2. 您的 PC 是四核的吗?对于您的 PC 和 GUI,100% 可能是 25%,多线程可能会更好地使用 CPU。

  3. 既然你说这是非GUI版本,那你是不是用println过分了,即非缓冲打印?

如果可能的话,并行性将修复 #2,甚至可能会通过一些设计更改甚至 #1

【讨论】:

  • 是的,它会出现无限循环,而且我只有两个内核,所以这不是多线程的问题。我就更不明白了。为什么我的代码在完成之前只想使用 25%。
  • @DeviousCoder 那么它可能不受 CPU 限制,你确定你的代码是这样写的吗?可能是磁盘读取过多或同步打印到屏幕上
  • 是的,它可能是一个同步问题,但是当 GUI 存在时我怎么看不到这个问题?
  • @DeviousCoder 你还在GUI版程序里做很多println吗?
  • 在执行过程中完成了 4 个 println,这让一切都变慢了。好电话 Karthik ;)
猜你喜欢
  • 2016-07-29
  • 2011-02-21
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-07
  • 2011-05-25
  • 2019-09-10
相关资源
最近更新 更多