2012-06-11 166 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."); 
相關問題