Java 保存字符串变量与硬编码相比节省的时间

Java 保存字符串变量与硬编码相比节省的时间,java,string,optimization,execution-time,Java,String,Optimization,Execution Time,我已尝试在web/stackoverflow上搜索此问题,但找不到答案。我不确定这是因为它是如此明显还是如此微不足道 我的基本问题是。。。哪个性能更好/提高了多少 String attacker = pairs.getKey(); mobInstanceMap.replace(attacker, 0); vs: 我喜欢第一个的可读性,但我一直在开发一个MMORPG,我需要非常小心的性能。我试图在下面做一个实验,但我想我会问大师,因为我很难推断。我翻转了运行哪一个,因为我发现当两个都运行时(一个

我已尝试在web/stackoverflow上搜索此问题,但找不到答案。我不确定这是因为它是如此明显还是如此微不足道

我的基本问题是。。。哪个性能更好/提高了多少

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

我喜欢第一个的可读性,但我一直在开发一个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);
}
publicstaticvoidmain(字符串[]args){
long hardcodeTotal=0;
long saveTotal=0;
//对于(int i=0;i<10000;i++){
//saveTotal+=checkRunTimeSaveString();
//      }
对于(int i=0;i<10000;i++){
hardcodeTotal+=checkRunTimeHardcodeString();
}
System.out.println(“hardcodeTotal:+hardcodeTotal/100.0+”\t“+”saveTotal:+saveTotal/100.0);
}
私有静态长checkRunTimeSaveString(){
long StartTime=System.nanoTime();
迭代器it=mobInstanceMap.entrySet().Iterator();
while(it.hasNext()){//在实体(attackee)移动时更新AttackMap
条目对=it.next();
字符串攻击者=pairs.getKey();
mobInstanceMap.replace(攻击者,0);
}
返回(System.nanoTime()-StartTime);
}
私有静态长checkRunTimeHardcodeString(){
long StartTime=System.nanoTime();
迭代器it=mobInstanceMap.entrySet().Iterator();
while(it.hasNext()){//在实体(attackee)移动时更新AttackMap
条目对=it.next();
mobInstanceMap.replace(pairs.getKey(),0);
}
返回(System.nanoTime()-StartTime);
}

很可能,JVM会优化中间分配,它们的性能完全相同

在这两种情况下,这些东西可能带来的性能影响几乎都不明显。除非在极端情况下,否则不应该担心性能。始终选择可读性


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

很可能,JVM会优化中间分配,它们的性能完全相同

在这两种情况下,这些东西可能带来的性能影响几乎都不明显。除非在极端情况下,否则不应该担心性能。始终选择可读性


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

您可以使用JVisualVM之类的工具分析这两种实现,以查看确切的差异。如果您想进行大量测试,您可以使用Contiperf之类的工具,然后为我们大家分享结果:)

您可以使用JVisualVM之类的工具分析这两种实现,以查看确切的差异。如果你想进行大量测试,你可以使用像Contiperf这样的工具,然后为我们大家分享结果:)

我同意Keppil的观点,性能可能完全相同。如果有一点不同,如果您关心性能上的微小改进,那么您可能不应该首先使用Java。

我同意Keppil的观点,即性能可能完全相同。如果有一点不同,如果您关心性能上的微小改进,那么您可能不应该首先使用Java。

无论性能如何,也不管您发布的代码如何,我都会选择第一选择,因为您说过它更可读,而且更易于维护。假设您正在调试应用程序,使用第二种选择,您将不容易看到
pairs.getKey()
的值,除非您有手表,否则witch比只将鼠标指向变量
攻击者
更不容易。这只是为了发展阶段。现在您的代码正在生产中,并且您在该行上获得了一个带有
NPE
的堆栈跟踪,那么原因是什么<代码>移动实例映射或
成对
?同意。谢谢你,伙计,谢谢你的安慰:)不管你的表现如何,不管你发布的代码如何,我都会选择第一选择,因为你说它更可读,而且更易于维护。假设您正在调试应用程序,使用第二种选择,您将不容易看到
pairs.getKey()
的值,除非您有手表,否则witch比只将鼠标指向变量
攻击者
更不容易。这只是为了发展阶段。现在您的代码正在生产中,并且您在该行上获得了一个带有
NPE
的堆栈跟踪,那么原因是什么<代码>移动实例映射或
成对
?同意。谢谢,伙计,谢谢你的安慰:)谢谢,我只是想确定一下。我的想法完全正确。很高兴得到确认:汉克斯,我只是想确认一下。我的想法完全正确。很高兴得到确认:Dgreat now我的待办事项::列表已增长!!:)太好了,现在我的待办事项列表增加了!!:)
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);
}