我有一个非常简单的java程序,打印出100万个随机数。 在linux中,我观察到这个程序在其生命周期中所占的cpu百分比,它从98%开始,然后逐渐降低到2%,从而导致程序非常慢。 什么是可能导致程序逐渐减lesscpu时间的一些因素?
我已经尝试用nice -20运行它,但我仍然看到相同的结果。
编辑:使用/usr/bin/time -v运行程序我看到非自愿上下文切换(588自愿vs 16478非自愿)的exception数量,这表明操作系统正在让其他一些更高优先级的进程运行。
我希望我的服务能够运行,但作为恰好是pipe理员(Windows / UAC)的用户,
导致UnsatisfiedLinkError的32位DLL
One Note Api拒绝承载令牌,错误401
在BoxLayout中水平放置button取决于操作系统
在Windows 7 x64系统上安装jre-6u30-windows-i586.exe时出现问题
在ms窗口中编译mac os java文件时出错
无法在DJ Native browser中全屏pipe理您的video
在Linux / X窗口系统下屏幕阅读/鼠标点击?
使用Java将读取WAV文件时的采样率转换为采样数组
在Ubuntu上设置Java环境path时出现问题(libjvm.so:无法打开共享目标文件:没有这样的文件或目录)
它归结为两件事情:
I / O很贵,而且
取决于你如何存储数字,这也会对性能产生不利影响。
如果你主要在一个循环中做一百万次System.out.println(randInt) ,那么这会变得很贵。 I / O不是那些免费的东西,写入任何输出流会花费资源。
我首先通过JConsole或VisualVM进行性能分析,以了解cpu占用率低时的实际情况。 正如评论中提到的那样,阻塞的几率很高,例如等待IO(用户输入,SQL查询需要很长时间等)
如果您的应用程序是I / O绑定的 – 例如等待网络调用的响应,或者磁盘读/写
如果你想尝试平衡一切,你应该创建一个队列来保存数字打印,然后让一个线程生成它们(生产者),另一个线程读取并打印它们(消费者)。 这可以很容易地用LinkedBlockingQueue完成。
public class PrintQueueExample { private BlockingQueue<Integer> printQueue = new LinkedBlockingQueue<Integer>(); public static void main(String[] args) throws InterruptedException { PrinterThread thread = new PrinterThread(); thread.start(); for (int i = 0; i < 1000000; i++) { int toPrint = ...(i) ; printQueue.put(Integer.valueOf(toPrint)); } thread.interrupt(); thread.join(); System.out.println("Complete"); } private static class PrinterThread extends Thread { @Override public void run() { try { while (true) { Integer toPrint = printQueue.take(); System.out.println(toPrint); } } catch (InterruptedException e) { // Interruption comes from main,means processing numbers has stopped // Finish remaining numbers and stop thread List<Integer> remainingNumbers = new ArrayList<Integer>(); printQueue.drainTo(remainingNumbers); for (Integer toPrint : remainingNumbers) System.out.println(toPrint); } } } }
这个代码可能有一些问题,但这是它的要点。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。