提问人:KisnardOnline 提问时间:11/4/2023 更新时间:11/4/2023 访问量:39
Java 局部变量与全局变量在主游戏循环中的性能
Performance of Java local vs global variable in main game loop
问:
我的 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);
}
}
}
答:
-1赞
Sree Kumar
11/4/2023
#1
我正在尝试回答您问题的这一部分:
我想知道将局部变量转换为全局变量是否有助于性能。
在基于上下文、机器、我们编写代码的方式等的性能问题上,总是存在一些主观性。以及我们如何衡量它!测量本身可能会增加其自身的开销。
记下我对此事的看法大体上是正确的。基于以下情况,通常情况下,局部变量比长期变量(全局变量)更有可能对性能有更大的帮助。
- 在 Java 中创建对象相当便宜。因此,我们无需担心创建时的成本
- GC并不便宜。您必须收集的对象越多,执行 GC 所需的时间就越多。
- 长寿命对象在这里得分。
- 长期变量具有以下问题,这些问题在局部变量中得到解决。(但是,有时您确实需要全局变量。如果你已经解决了这些问题,那就太好了。
- 任何具有访问权限的代码都可以编辑(不会直接导致性能问题)
- 可能导致内存泄漏,例如,s(这会导致性能问题)
Map
何时使用长期变量
- 当变量没有“深度”链接对象时,例如集合甚至普通的 Java 对象,它们引用其他对象,进一步引用其他对象等。
- 当变量的值为常量时,即使它是一个集合。即静态集合。
- 当程序员确定他/她由于程序的需要而需要它时。
评论
test