节省时间以保存字符串变量与硬编码

Kis*_*ine 1 java string optimization execution-time

我已经尝试搜索web/stackoverflow但是找不到答案.我不确定是不是因为它是如此明显或如此微不足道的差异.

我的基本问题是......哪个表现更好/多少?

String attacker = pairs.getKey();
mobInstanceMap.replace(attacker, 0);
Run Code Online (Sandbox Code Playgroud)

VS:

mobInstanceMap.replace(pairs.getKey(), 0);
Run Code Online (Sandbox Code Playgroud)

我喜欢第一个可读性,但我一直在开发一个MMORPG,我需要非常小心它的性能.我试着在下面做一个实验,但想到我会问大师,因为我很难推断出来.我翻了哪一个运行,因为我发现当运行两个(一个接一个)时,第二个运行得更好(可能是由于JVM优化).

对不起,如果有人问过并回答了......或者是显而易见的,但是我搜索过并没有找到任何东西(也许我不知道该搜索什么).我不仅想知道'拯救'字符串,还有其他变量.

public static void main(String[] args){
    long hardcodeTotal = 0;
    long saveTotal = 0;

//      for (int i = 0; i < 10000; i++){
//          saveTotal += checkRunTimeSaveString();
//      }

    for (int i = 0; i < 10000; i++){
        hardcodeTotal += checkRunTimeHardcodeString();
    }

    System.out.println("hardcodeTotal: " + hardcodeTotal/100.0 + "\t" + "saveTotal: " + saveTotal/100.0);

}

private static long checkRunTimeSaveString(){
    long StartTime = System.nanoTime();

    Iterator<Entry<String, Integer>> it = mobInstanceMap.entrySet().iterator();
    while (it.hasNext()) { //to update the AttackingMap when entity(attackee) moves
        Entry<String, Integer> pairs = it.next();
        String attacker = pairs.getKey();
        mobInstanceMap.replace(attacker, 0);
    }

    return(System.nanoTime() - StartTime);
}

private static long checkRunTimeHardcodeString(){
    long StartTime = System.nanoTime();

    Iterator<Entry<String, Integer>> it = mobInstanceMap.entrySet().iterator();
    while (it.hasNext()) { //to update the AttackingMap when entity(attackee) moves
        Entry<String, Integer> pairs = it.next();
        mobInstanceMap.replace(pairs.getKey(), 0);
    }

    return(System.nanoTime() - StartTime);
}
Run Code Online (Sandbox Code Playgroud)

Kep*_*pil 5

很可能,中间分配将由JVM优化,并且它们将具有完全相同的性能.

在任何一种情况下,这些东西的可能性能命中几乎都不会引起注意.除非在极端情况下,否则您不应担心性能.始终选择可读性.

还应该补充的是,您在上面的代码中使用的微基准测试类型非常难以从中获得可靠的测量结果.您无法控制太多因素(内部JVM优化,JVM预热等),以准确测量您要测试的确切内容.