1

我曾尝试在 web/stackoverflow 上搜索此内容,但找不到答案。我不确定是因为它是如此明显还是如此微不足道的差异。

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

String attacker = pairs.getKey();
mobInstanceMap.replace(attacker, 0);

与:

mobInstanceMap.replace(pairs.getKey(), 0);

我喜欢第一个可读性,但我一直在开发一个 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);
}
4

3 回答 3

5

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

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

还应该补充一点,您在上述代码中的微基准测试类型很难从中获得可靠的测量结果。涉及到您无法控制的因素太多(内部 JVM 优化、JVM 预热等),无法准确测量您想要测试的确切内容。

于 2013-05-30T19:31:41.270 回答
1

您可以使用 JVisualVM 之类的工具来分析这两种实现,以查看确切的差异。如果您想进行大量测试,您可以使用 Contiperf http://databene.org/contiperf之类的工具,然后将结果分享给我们所有人 :)

于 2013-05-30T19:35:12.513 回答
0

我同意 Keppil 的观点,即性能可能完全相同。如果有细微差别,并且如果您关心性能上的如此小的改进,那么您可能一开始就不应该使用 Java。

于 2013-05-30T22:58:03.073 回答