Java的。如何提高性能?

时间:2012-11-17 22:25:56

标签: java performance if-statement

我在下面练习:

  

Lavin Interactive Company,已经开发了回合制   策略Losers-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倍的内存。

我的问题:怎么样?怎么样?这怎么可能?为什么我的代码如此愚蠢? 我需要做些什么来改进我的代码?

6 个答案:

答案 0 :(得分: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 :(得分:1)

您可以通过避开扫描仪来减少内存。只需通过InputStreamReader读取一行并使用Integer类解析它。

答案 2 :(得分: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。

答案 3 :(得分:0)

假设您正在使用另一个答案的BufferedStream输入构思,而不是使用try-catch块将输入安全地转换为整数,您可以从main方法中抛出Exception。这可以防止您加载任何专门的异常。

我想出了.078秒,内存为366 kb。我看到的最好的是.062,内存为18kb。那只是疯了。

答案 4 :(得分:0)

如果要改善执行时间,应该在条件内部执行System.out.println,然后返回。您也不需要创建名称var。

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

答案 5 :(得分: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();
    }
}