2012-06-11 87 views
1

我试图解决这个problem下面Java代码:我可以做些什么来提高Java代码的性能?

Scanner scanner = new Scanner(System.in); 
    int testNum = scanner.nextInt(); 
    StringBuilder sb = new StringBuilder(); 
    double x; 
    double y; 
    int year; 
    for(int i = 0; i < testNum; i++) { 
     x = scanner.nextDouble(); 
     y = scanner.nextDouble(); 
     year = (int)((x * x + y * y) * Math.PI/100); 
     sb.append("Property ").append(i+1).append(": This property will begin eroding in year "); 
     if(year * 100/Math.PI < x * x + y * y) 
      sb.append(year+1); 
     else 
      sb.append(year); 
     System.out.println(sb.append('.')); 
     sb.delete(0, sb.length()); 
    } 
    System.out.println("END OF OUTPUT."); 

在判断我的节目,我觉得它的成本3164K内存和125MS的时间,同时也有许多其他的用户,其提交被接受,而且只花了约92K内存和15MS时间。这比我的结果好得多,那么有没有更好的方法来解决这个问题?

+0

我认为for循环是处理器上最难的。不知道它是否会做任何事情,但也许它成为一个while循环? 'while(scanner.hasNext())'也许? –

+0

我认为他们做一些形式的IO优化,这是不值得你的时间。您可能想尝试不使用扫描仪,但可以使用BufferReader + StringTokenizer + Double.parseDouble()。你也可以尝试读取输入到char []并进行解析,并通过在char []上进行工作来打印整数。但我保证,你花时间进行这种优化并不会帮助你在竞争性节目中获得更好的表现。 – nhahtdh

+1

你的if语句似乎在检查'(x * x + y * y)>(x * x + y * y)'。去掉它?另外,使用StringBuilder附加并不断清除它,或者为每次迭代重新分配一个字符串的值会更快吗? – acattle

回答

2

该代码几乎可以肯定将被输入绑定,而不是处理器的结合,所以有可能是在试图“优化”的代码根本没有任何意义。如果从键盘上读取输入,那么它的运行速度就会更快,因为它只能按照键入的速度运行。如果System.in已被重定向,请在它与Scanner.之间使用BufferedInputStream若要进行微优化,我将使用Formatter而不是StringBuilder,,我只会计算一次PI表达式,而不是两次,但JVM无论如何都会发现。

+0

这是在线裁判,所以输入肯定是重定向的。由于Scanner内部使用Pattern,因此Scanner被证实会减慢输入速度。 – nhahtdh

+0

@nhahtdh输入缓慢主要是因为它是BufferedInputStream修复的一次一个字节,不是因为Pattern,它不修复。 – EJP

+0

可能是真的。我用一些实现(例如BufferedReader + StringTokenizer)进行了测试,但从未在缓冲扫描器和非缓冲扫描器之间进行比较。 – nhahtdh

0

我认为使用StringBuilder来构建字符串,然后立即打印出来并清理掉StringBuilder需要额外的处理以及if语句检查,看起来像是决定应该向上舍入还是向下舍入。此外,您每次通过循环重新计算Math.PI * 100的值。你可以尝试这样的:

Scanner scanner = new Scanner(System.in); 
int testNum = scanner.nextInt(); 

double x; 
double y; 
double factor = Math.PI * 100; 

for(int i = 0; i < testNum; i++) { 
    x = scanner.nextDouble(); 
    y = scanner.nextDouble(); 

    System.out.println("Property " + (i+1) + ": This property will begin eroding in year " + Math.round((x * x + y * y) * factor) + "."); 
} 
System.out.println("END OF OUTPUT."); 
相关问题