【问题标题】:Why does my Java drawing code take so much CPU?为什么我的 Java 绘图代码占用这么多 CPU?
【发布时间】:2019-02-09 14:04:23
【问题描述】:

我学习了 3 天的 Java,并编写了一个代码来绘制一条由 X 构成的对角线。它占用了我 i5 CPU 的 28%,我不知道为什么。

public class Main { 
    public static void main(String[] args) { 

        for (int i=0; i<20000; i++) {
            for (int j=0; j<i; j++) {
                System.out.print("  ");
            }
            System.out.println("X");
        }
    }
}

编辑 1: 顺便说一下,我运行它的第一分钟和 10 分钟后的输出有点不同。奇怪的。 X 之间的距离变长。 10分钟后截图

编辑 2: 我制作了另一个代码,只是为了知道我达到的“进度”,当我达到 100、200 等时,它会打印出来。但是代码无法在 Windows 上编译,它在 https://www.compilejava.net 上编译得很好。有什么问题?

public class Main {
  public static void main(String[] args) { 

for (int i=0; i<20000; i++) {
    for (int j=0; j<i; j++)
    {
    System.out.print("  ");
    }
System.out.println("X");
if ((i % 100)==0) {
System.out.println("Your cute code made it to the 100th lapse!");
}
}
}
}

【问题讨论】:

  • 仔细查看您的嵌套循环。您真的要打印 20,000 个 X 吗?
  • @Zephyr 是什么让您认为循环呈指数增长?对我来说,它是线性的。
  • @Glains 每行空格数是i的两倍,所以会是二次的

标签: java


【解决方案1】:

嗯,很明显这需要很多时间! 它会迭代很多次! j 的每个值都是 20000 (1+2+3+4+...+19999+20000) 的总和。

所以复杂度高于O(n)

考虑到这一点,您正在执行的打印数量确实很高。 20000 次 X 和 20000 个空格的总和!

【讨论】:

    【解决方案2】:

    为了演示这里发生了什么,请考虑以下代码:

    public static void main(String[] args) {
    
        int iTotal = 0;
        int jTotal = 0;
        for (int i = 0; i < 20000; i++) {
            for (int j = 0; j < i; j++) {
                jTotal += 1;
            }
            iTotal += 1;
        }
    
        System.out.println("Total I: " + iTotal);
        System.out.println("Total J: " + jTotal);
        System.out.println("Total:   " + jTotal + iTotal);
    }
    

    这里我删除了打印,只是使用计数器来帮助您准确了解这里发生的情况

    输出:

    Total I: 20,000
    Total J: 199,990,000
    Total:   19,999,000,020,000
    

    【讨论】:

    • 那么,为什么 John Bollinger 将其计算为 800000000 个空格字符?
    • @Basafish - 他计算时我不在,所以我无法回答;)
    • 两个原因,@Basafish:(1)我统计了打印的空格字符的个数,内循环的每次迭代都打印了两个空格的字符串,(2 ) 我算错了 2 倍(现已更正)。
    • 非常感谢@JohnBollinger 和 Zephyr 的努力。编辑2:我制作了另一个代码只是为了知道我达到的“进度”,当我达到100、200等时,它会打印出来。但是代码在 Windows 上编译失败,它在compilejava.net 上编译得很好。有什么问题?公共类 Main { public static void main(String[] args) { for (int i=0; i
    • @Basafish - 如果您还有其他问题,请将其作为新问题发布(当然,搜索并尝试解决自己之后):)
    【解决方案3】:

    您的代码尝试打印 20000 个“X”字符,正如在 cmets 中观察到的那样,但更糟糕的是,它尝试打印总共大约 400000000 个空格字符。计算机速度很快,但这仍然需要一些努力。

    【讨论】:

    • @Gox,结果正好是 400020000,或大约 400000000,空格字符,正如我已经更正这个答案所说的那样,因为每个内部循环的迭代打印两个。
    【解决方案4】:

    如果我的高中数学没记错的话,你正在执行大约 2 亿次打印调用。您正在生成 20,000 行屏幕输出。使用相当大量的 CPU 并需要一些时间才能完成似乎并不奇怪。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      相关资源
      最近更新 更多