繁体   English   中英

为什么这个小Java程序会占用这么多时间和内存?

[英]Why does this little Java program take up so much time and memory?

所以我在做在线编程挑战性问题,以便我可以成为一个更好的程序员。 我是初学者。 我所做的问题的范围是编写一个程序,该程序从输入流中读取数字,并计算数字阶乘中的零数。 我编写的程序通过了在线评审,并且是正确的。 解决问题时,它将为您提供有关程序的数据。 这是我的代码,后面是数据和我的问题。 这是我想出并写的:

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        int n = -1, count = 0;

        //first number is an int that tells us how many numbers are in the input
        //(how many numbers we need to run the algorithm on)

        Scanner sc = new Scanner( System.in );
        int bound = sc.nextInt();

        //for each number in the input
        for (int i = 0; i < bound; i++) {

            n = sc.nextInt(); //read the number

            count = 0; //set number of 0's in that factorial to 0

            int multipleOfFive = 5; //start counting number of multiples of 5

            while (n / multipleOfFive > 0) {

                //add the number of times this multiple of 5 goes into the number

                count += n / multipleOfFive; 

                multipleOfFive *= 5; //get next factor of 5

            }

            System.out.println(count); //print this numbers solution

        }

        sc.close(); //close the scanner
    }
}

系统返回了我程序中的以下数据:

memory usage: 5512k, time: 1375ms

我将此与其他已正确提交此问题的用户进行了比较,他们处于以下范围内:

memory usage: 144k - 228k, time: 125ms - 625ms

我对时代的变化感到惊讶。 我不知道该如何减少我的时间。 所以我的问题是...有什么明显的我可以做的事情来改进此程序,以缩短时间并减少内存使用量? 使用Scanner类是个坏主意吗? 我尝试研究不同的I / O类,但没有发现任何看起来很有希望改善空间或时间的东西。 如果有人有任何有用的建议,那就这样。 为了澄清,问题不是关于算法如何工作。 问题是如何使它变得更好。 谢谢。

更新:他们可以用C,C ++或Java编写代码。 所以我想我的问题的一部分是这样的:是否会做像用C或C ++编写完全相同的事情那样简单的事情就足以将运行时减少一半(假设在同一台计算机上)和/或消除虚拟机?足以显着减少内存使用量? 为了明确起见,我列出的数据是程序使用了多少内存以及执行所花费的总时间(以毫秒为单位)。

因此,既然我知道您正在将自己的数字与(C / C ++)进行比较,那么您几乎无能为力。

Java与C / C ++的不同之处在于,每次执行应用程序时,它都会启动一个完整的Java虚拟机(JVM)。 仅此一项将招致更多的内存需求并消耗启动时间。 这是Java的事实,但是考虑到大多数计算机的大量内存以及大多数Java应用程序都是长时间运行的事实,这通常不是问题。 对于这样一个长时间运行的过程,不会引起额外几秒钟的启动时间。

从好的方面来说,您的已编译jar文件将在具有JVM的任何操作系统上运行,而已编译的C / C ++应用则不具备此功能,因此需要针对每种平台/操作系统组合进行专门编译。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM