关闭Scanner对性能有影响吗?

4
我正在解决一道竞赛问题,在这个问题中,我使用scanner接收用户输入。
这里有两段代码,一个关闭了scanner,一个没有关闭。

关闭scanner

import java.util.Scanner;

public class JImSelection {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.valueOf(scanner.nextLine());
        while (n-- > 0) {
            double number = (Math.log(Long.valueOf(scanner.nextLine())) / Math.log(2));
            System.out.println((int) number - number == 0 ? "Yes" : "No");
        }
        scanner.close();
    }
}

未关闭扫描器。
import java.util.Scanner;

public class JImSelection {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = Integer.valueOf(scanner.nextLine());
        while (n-- > 0) {
            double number = (Math.log(Long.valueOf(scanner.nextLine())) / Math.log(2));
            System.out.println((int) number - number == 0 ? "Yes" : "No");
        }           
    }
}

第一种方法(关闭扫描器)得分为 14.47
第二种方法(不关闭扫描器)得分为 15.22
我认为编译器在使用 scanner.close(); 释放资源,这就是得分差异的原因。
这是得分判定公式。

它被赋予100分。假设您提交了一个n个字符的解决方案,则您的得分为(56 / n)* 100。


你说得完全正确,当关闭Scanner时,jvm会清除一些资源。如果其底层的readable也实现了Closeable接口,则readable的close方法也将被调用。 - Robin Jonsson
1
分数和性能有什么关系?! - JimmyB
1
这是某种代码高尔夫吗? - chrylis -cautiouslyoptimistic-
是的,这个高尔夫问题。 - Key_coder
3
您知道吗,许多代码“高尔夫”问题都与源代码的大小有关?越小越好。因此,如果省略了一条语句,源代码就会变得更短,因而得分会更高。这与“性能”无关。 - JimmyB
显示剩余4条评论
1个回答

5
它被分配了100分。假设您提交了一个n个字符的解决方案,那么您的得分为(56/n)*100。
你在开玩笑吧?一个解决方案的得分是14.47。这意味着你的源代码大约有387个字符。(=~=表示“约等于”)
在另一个实例中,您的得分为15.22,这意味着您的源代码长度为约368个字符。
差异为29个字符,这可能是您源代码中包含"scanner.close();"一行的长度(包括前导空格、两个尾随空格和回车/换行符对)。
这与您的代码性能无关。

那是一个很敏锐的观察。 - nafas
1
谢谢@Erwin和Hanno Binder的建议,让我在这之前就明白了问题。我之前不知道高尔夫问题。 - Key_coder
用Java赢得一个以代码长度为评分标准的代码高尔夫问题很难。不知道是否有人成功编写了一个预处理器,使你能够编写非常短的Java代码。虽然我还没有看到过。 - Erwin Bolwidt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接