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

问题描述 投票:0回答:1

我的 Java 游戏服务器上有一个主循环。我想知道将局部变量转换为全局变量是否有助于性能。运行此示例场景 (ii < 100) shows the opposite.

  • averageMethodRunTimeHashtable:{localVariableMethod=628, 全局变量方法=888}
  • averageMethodRunTimeHashtable: {localVariableMethod=601,globalVariableMethod=899}
  • averageMethodRunTimeHashtable:{localVariableMethod=543, 全局变量方法=773}
  • averageMethodRunTimeHashtable: {localVariableMethod=513,globalVariableMethod=800}

跑步 (ii < 1000000) or for longer shows inconsistent results. Any suggestions/insight here?

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 performance global-variables local-variables
1个回答
0
投票

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

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

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

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

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

何时使用长期变量

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