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

时间:2014-04-02 16:37:36

标签: java

所以我正在进行在线编程挑战问题,这样我才能成为更好的程序员。我是初学者。我所遇到的问题的范围是编写一个程序,从输入流中读取一个数字,并计算一个数字的阶乘中的零数。我写的程序通过了在线评判并且是正确的。当您通过问题时,它会为您提供有关您的程序的数据。这是我的代码,后面是数据和我的问题。以下是我提出的并写道:

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 ++编写完全相同的东西就足以将运行时减少一半(假设在同一台计算机上)和/或消除虚拟机足以显着减少内存使用量?为了澄清,我列出的数据是程序使用了多少内存以及执行所花费的总时间(毫秒)。

1 个答案:

答案 0 :(得分:2)

所以现在我看到你将你的数字与(C / C ++)进行比较,你可以做很少的事情来减少你所看到的。

Java与C / C ++的不同之处在于,每次执行应用程序时,它都会创建一个完整的Java虚拟机(JVM)。仅这一点就会产生更多的内存需求并消耗启动时间。这是Java的事实,但考虑到大多数机器的大量内存以及大多数Java应用程序都是长时间运行的事实,这一问题通常不是问题。对于这样一个长时间运行的过程,需要额外几秒的启动时间是没有问题的。

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