2012-11-17 63 views
1

我練習下面:Java。我該如何提高性能?

的拉文互動公司,該公司開發的回合制 戰略失敗者-V,不斷被 延長其目標市場定位在遊戲中儘可能多的語言,因爲它可以。尤其是 他們有興趣在Anindilyakwa創建一個遊戲版本, 這是土着澳大利亞人使用的語言之一。 但是,Anindilyakwa 沒有數字這一事實使本地化變得複雜。如何將一個短語如「你有七個黑龍和你的敵人有四十個黑龍」翻譯成 這種語言?本地化者已決定將其翻譯如下: 「你的黑龍很少,而你的敵人有很多黑龍。」 他們編制了一張表格,顯示了用Anindilyakwa字詞替換 怪物的數字的規則。

,我的實下面:

import java.util.Scanner; 

public class Localization { 

    public static void main(String[] args) { 

     Scanner s = new Scanner(System.in); 
     int number; 
     String designation; 

     number = s.nextInt(); 

     if (number >= 1 && number <= 4) { 
     designation = "few"; 
     }else if(number >= 5 && number <= 9){ 
      designation = "several"; 
     }else if(number >= 10 && number <= 19){ 
      designation = "pack"; 
     }else if(number >= 20 && number <= 49) { 
      designation = "lots"; 
     }else if(number >= 50 && number <= 99){ 
      designation = "horde"; 
     }else if(number >= 100 && number <= 249){ 
      designation = "throng"; 
     }else if(number >= 250 && number <= 499){ 
      designation = "swarm"; 
     }else if(number >= 500 && number <= 999){ 
      designation = "zounds"; 
     }else{ 
      designation = "legion"; 
     } 
     System.out.println(designation); 

    } 
} 

我裝我的代碼比賽服務器上。我看下統計:

執行時間:使用0.109

內存:1 434 KB

在此之後我檢查頂層的結果和我所看到的:

等級1 :

執行時間:0.062

存儲器用於:78 KB

結論:

我的代碼兩次較慢;我的代碼使用了20倍以上的內存。

我的問題:怎麼樣?怎麼樣?這怎麼可能?爲什麼我的代碼很愚蠢? 我需要改變什麼來改善我的代碼?

+1

你可以發佈一個鏈接到代碼提交網站?我想捅一下。 – thedan

+1

是Java中最重要的結果嗎?您創建的對象數量幾乎不會考慮這種內存使用情況的差異。 – assylias

+0

@thedan,網站鏈接:http://acm.timus.ru/problem.aspx?space=1&num=1785 – user471011

回答

0

我得到它下降到370 KB,0.78秒與此代碼。有點無聊,以得到它...

import java.io.IOException; 

public class Localization { 
    public static void main (String[] args) { 
     short s = 0; 
     while (true) { 
      int next = 0; 
      try { 
       next = System.in.read(); 
      } catch (IOException e) { 

      } 
      if (next < '0' || next > '9') break; 

      s = (short) (s * 10); 
      s = (short) (s + ((short) (next - '0'))); 
     } 

     if (s >= 100) { 
      if (s >= 500) { 
       if (s >= 1000) { 
        System.out.print('l'); 
        System.out.print('e'); 
        System.out.print('g'); 
        System.out.print('i'); 
        System.out.print('o'); 
        System.out.print('n'); 
       } else { 
        System.out.print('z'); 
        System.out.print('o'); 
        System.out.print('u'); 
        System.out.print('n'); 
        System.out.print('d'); 
        System.out.print('s'); 
       } 
      } else { 
       if (s >= 250) { 
        System.out.print('s'); 
        System.out.print('w'); 
        System.out.print('a'); 
        System.out.print('r'); 
        System.out.print('m'); 
       } else { 
        System.out.print('t'); 
        System.out.print('h'); 
        System.out.print('r'); 
        System.out.print('o'); 
        System.out.print('n'); 
        System.out.print('g'); 
       } 
      } 
     } else { 
      if (s >= 10) { 
       if (s >= 50) { 
        System.out.print('h'); 
        System.out.print('o'); 
        System.out.print('r'); 
        System.out.print('d'); 
        System.out.print('e'); 
       } else if (s >= 20) { 
        System.out.print('l'); 
        System.out.print('o'); 
        System.out.print('t'); 
        System.out.print('s'); 
       } else { 
        System.out.print('p'); 
        System.out.print('a'); 
        System.out.print('c'); 
        System.out.print('k'); 
       } 
      } else { 
       if (s >= 5) { 
        System.out.print('s'); 
        System.out.print('e'); 
        System.out.print('v'); 
        System.out.print('e'); 
        System.out.print('r'); 
        System.out.print('a'); 
        System.out.print('l'); 
       } else { 
        System.out.print('f'); 
        System.out.print('e'); 
        System.out.print('w'); 
       } 
      } 
     } 

     System.out.println(); 
     System.out.flush(); 
    } 
} 
+0

常見問題解答部分:A + B問題解決方案中只有兩個變量,爲什麼Judge System報告我的解決方案使用的內存超過100 KB? 判定系統測量編譯解決方案使用的內存大小。這個大小總是大於用戶變量的大小。該存儲器的很大一部分被編譯器和操作系統創建的變量使用。通常,非用戶內存的大小小於300 KB。 – user471011

2

您可以削減if-else這樣的語句中的支票。相反的:

if (number >= 1 && number <= 4) { 
    designation = "few"; 
}else if(number >= 5 && number <= 9){ 
    // .... 

您只能檢查爲上限:

if (number >= 1 && number < 5) { 
    designation = "few"; 
}else if(number < 10){ 
    // ... 
1

你可以通過避免掃描儀減少內存。只需通過InputStreamReader讀取一行並使用Integer類進行解析即可。

+0

一些實驗讓我真的開始討厭掃描儀,甚至比以前更加討厭。 +1 – durron597

0

假設您從另一個答案中使用BufferedStream輸入思想,而不是使用try-catch塊來安全地將輸入轉換爲整數,那麼您可以從主方法中拋出Exception。這可以防止您加載任何專門的例外。

我想出了0.078秒,內存366 kb。我看到的最好的是.062,內存爲18kb。這太瘋狂了。

0

如果您想提高執行時間,您應該在條件中執行System.out.println並返回。你也不需要創建指定變種。

}else if(number >= 5 && number <= 9){ 
     System.out.println("several"); 
     return; 
1

不確定內存問題。時間和內存可能由圖書館代碼(println,scanner)支配。我認爲println會刷新流,例如,這很貴。

要減少平均和最大比較次數,您可以嘗試利用數字的分佈方式。不知道的是,你可以使用二進制搜索(在水桶在這裏完成的,你也可以做到這一點在其會產生不同的樹數空間):

if (number < 50) { 
    if (number < 10) { 
    if (number < 5) { 
     designation = "few"; 
    } else { 
     designation = "several"; 
    } 
    } else { 
    if(number < 20) { 
     designation = "pack"; 
    } else { 
     designation = "lots"; 
    } 
} else { 
    if (number < 250) { 
    if (number < 100) { 
     designation = "horde"; 
    } else { 
     designation = "throng"; 
    } 
    } else { 
    if (number number < 500) { 
     designation = "swarm"; 
    } else if (number number < 1000) { 
     designation = "zounds"; 
    } else{ 
     designation = "legion"; 
    } 
    } 
} 

此代碼需要4個比較去1000代替的8.