Java 局部变量与全局变量在主游戏循环中的性能

Performance of Java local vs global variable in main game loop

提问人:KisnardOnline 提问时间:11/4/2023 更新时间:11/4/2023 访问量:39

问:

我的 Java 游戏服务器上有一个主循环。我想知道将局部变量转换为全局变量是否有助于性能。运行此示例方案 (ii < 100) 显示的情况恰恰相反。

  • averageMethodRunTimeHashtable:{localVariableMethod=628, globalVariableMethod=888}
  • averageMethodRunTimeHashtable: {localVariableMethod=601, globalVariableMethod=899}
  • averageMethodRunTimeHashtable:{localVariableMethod=543, globalVariableMethod=773}
  • averageMethodRunTimeHashtable: {localVariableMethod=513, globalVariableMethod=800}

跑步 (ii < 1000000) 或更长时间显示不一致的结果。这里有任何建议/见解吗?

import java.util.Hashtable;

class HelloWorld {
    static Hashtable<String, Long> averageMethodRunTimeHashtable = new Hashtable<>();
    static long topTime = 0l;
    public static void main(String[] args) {
        //boolean stopServer = false; //usually stopped by an external source
        //while (!stopServer){ //normally this runs "forever"
        for (int ii = 0; ii < 100; ii++){ //for this example just run 100 times
            topTime = System.nanoTime();
            localVariableMethod();
            averageMethodRunTime("localVariableMethod", (System.nanoTime() - topTime));
        
            topTime = System.nanoTime();
            globalVariableMethod();
            averageMethodRunTime("globalVariableMethod", (System.nanoTime() - topTime));
        }
        
        System.out.println("averageMethodRunTimeHashtable: " + averageMethodRunTimeHashtable);
    }
    
    public static void localVariableMethod(){
        for (int i = 0; i < 100; i++){
            int test = i;
        }
    }
    
    static int test_globalVariableMethod = 0;
    public static void globalVariableMethod(){
        for (int i = 0; i < 100; i++){
            test_globalVariableMethod = i;
        }
    }
    
    public static void averageMethodRunTime(String method, long time) {
        if (averageMethodRunTimeHashtable.containsKey(method)) {
            averageMethodRunTimeHashtable.put(method, (time + averageMethodRunTimeHashtable.get(method)) / 2);
        } else {
            averageMethodRunTimeHashtable.put(method, time);
        }
    }
}
java 性能 全局 局部变量

评论

0赞 Kyroath 11/4/2023
你不会注意到有什么不同。结果不一致的原因很可能是因为运行时注意到该变量在赋值后从不读取,并优化了赋值。test

答:

-1赞 Sree Kumar 11/4/2023 #1

我正在尝试回答您问题的这一部分:

我想知道将局部变量转换为全局变量是否有助于性能。

在基于上下文、机器、我们编写代码的方式等的性能问题上,总是存在一些主观性。以及我们如何衡量它!测量本身可能会增加其自身的开销。

记下我对此事的看法大体上是正确的。基于以下情况,通常情况下,局部变量比长期变量(全局变量)更有可能对性能有更大的帮助。

  • 在 Java 中创建对象相当便宜。因此,我们无需担心创建时的成本
  • GC并不便宜。您必须收集的对象越多,执行 GC 所需的时间就越多。
    • 长寿命对象在这里得分。
  • 长期变量具有以下问题,这些问题在局部变量中得到解决。(但是,有时您确实需要全局变量。如果你已经解决了这些问题,那就太好了。
    1. 任何具有访问权限的代码都可以编辑(不会直接导致性能问题)
    2. 可能导致内存泄漏,例如,s(这会导致性能问题)Map

何时使用长期变量

  1. 当变量没有“深度”链接对象时,例如集合甚至普通的 Java 对象,它们引用其他对象,进一步引用其他对象等。
  2. 当变量的值为常量时,即使它是一个集合。即静态集合。
  3. 当程序员确定他/她由于程序的需要而需要它时。