【发布时间】:2020-10-04 12:20:05
【问题描述】:
我一直认为从实例化方法/函数访问实例化字段应该会提高性能,因为数据应该“更本地可用”(我知道这可能取决于系统和 JVM),而不是从静态上下文。请参阅说明我的观点的代码:
public class Lecture
{
public static void main(String[] args)
{
hold h1 = new hold();
long start1 = System.currentTimeMillis();
h1.accessOOPs();
long end1 = System.currentTimeMillis();
System.out.println("OOPS: "+ (end1 - start1));
hold h2 = new hold();
long start2 = System.currentTimeMillis();
hold.accessStatic(h2);
long end2 = System.currentTimeMillis();
System.out.println("Static (same class): "+ (end2 - start2));
hold h3 = new hold();
long start3 = System.currentTimeMillis();
accessStatic(h3);
long end3 = System.currentTimeMillis();
System.out.println("Static (different class): "+ (end3 - start3));
}
public static void accessStatic(hold h)
{
for (int i=0;i<h.vars.length;i++)
h.vars[i] = i;
for (int i : h.vars)
h.var1 += i;
for (int i: h.vars)
h.name += i;
}
}
class hold
{
int var1;
int vars[] = new int[10000];
String name;
public void accessOOPs()
{
for (int i=0;i<vars.length;i++)
vars[i] = i;
for (int i : vars)
var1 += i;
for (int i: vars)
name += i;
}
public static void accessStatic(hold h)
{
for (int i=0;i<h.vars.length;i++)
h.vars[i] = i;
for (int i : h.vars)
h.var1 += i;
for (int i: h.vars)
h.name += i;
}
}
在代码中,我有 3 个定时示例,我在其中访问/修改简单对象中的属性。第一个示例调用对象中的实例方法,因此理论上所有属性都应该更快地访问,因为它们与方法处于相同的上下文中。第二种调用对象类中的静态函数,每次都使用点运算符来访问属性。我的假设是这会更慢。第三个示例重复与第二个示例相同的操作,但这次是在一个单独的类中进行。我对收到的时间感到很困惑:
示例运行 1:
- 哎呀:135
- 静态(同一类):130
- 静态(不同类):120
示例运行 2:
- 哎呀:137
- 程序(同一类):135
- 程序(不同类别):128
当方法在单独的类中时,OOPs 方法始终优于静态方法,但我不明白为什么当静态方法在同一个类中时它会优于实例方法。这只是一个微小的差距,但它非常一致。这仅仅是因为静态实现正在缓存对正在访问的对象的引用吗?如果发生这种情况,那么我认为静态方法是否在单独的类中并不重要,所以我完全糊涂了。谁能回答为什么静态方法没有明显变慢?
【问题讨论】:
标签: java static instance-variables