静态变量和实例变量之间的性能差异
Performance difference between static and instance variables
An instance variable is one per Object, every object has its own copy of instance variable.
A static variable is one per Class, every object of that class shares the same Static variable.
class MyStaticClass{
private static int myStaticInt;
public static int getMyStaticInt() {return myStaticInt;}
}
class MyInstanceClass{
private int myNonStaticInt;
public int getMyNonStaticInt() {return myNonStaticInt;}
}
二者在性能上有区别吗?叫一个比叫另一个贵吗?
int i = MyStaticClass.getMyStaticInt();
或:
int i = new MyInstanceClass().getMyNonStaticInt();
这不是性能问题。静态变量和实例变量有不同的用途。
正在使用
int i = new MyInstatnceClass().getMyNonStaticInt();
几乎肯定是无用的,因为每次调用 new MyInstatnceClass()
都会创建一个新的 MyInstatnceClass
实例,并具有一个新的 myNonStaticInt
实例变量。由于您没有保留对创建的实例的引用,因此您无法两次检索相同的实例变量,这使得它毫无用处。
如果您需要在 class 的所有实例之间共享一个变量的单个副本,static
变量是可行的方法。
也就是说,后一个调用也更广泛,因为它涉及创建和初始化 MyInstatnceClass
class 的实例(除了加载和初始化 class如果这是第一次访问 class)。
另一方面,如果 class 是 class 的第一次访问,MyStaticClass.getMyStaticInt()
只会加载和初始化 class MyStaticClass
。它不必创建 class.
的任何实例
因为实例方法可以是多态的overridden, a very naive JVM implementation must at least initially use a virtual mehod table to find the appropriate method to call. Classes themselves, however are not polymorphic and class methods cannot be overridden. Due to this, they have a simpler lookup mechanism。
但是,现实世界中的 JVM 非常聪明,可以判断哪些方法永远不会被覆盖并优化此查找。换句话说,除了最人为设计的不存在 JVM 的实例之外,在所有实例中,性能都会有所不同。相反,使用静态方法来表示与整个 class 对象本身相关的功能,而不是与其单个实例相关的功能。
An instance variable is one per Object, every object has its own copy of instance variable.
A static variable is one per Class, every object of that class shares the same Static variable.
class MyStaticClass{
private static int myStaticInt;
public static int getMyStaticInt() {return myStaticInt;}
}
class MyInstanceClass{
private int myNonStaticInt;
public int getMyNonStaticInt() {return myNonStaticInt;}
}
二者在性能上有区别吗?叫一个比叫另一个贵吗?
int i = MyStaticClass.getMyStaticInt();
或:
int i = new MyInstanceClass().getMyNonStaticInt();
这不是性能问题。静态变量和实例变量有不同的用途。
正在使用
int i = new MyInstatnceClass().getMyNonStaticInt();
几乎肯定是无用的,因为每次调用 new MyInstatnceClass()
都会创建一个新的 MyInstatnceClass
实例,并具有一个新的 myNonStaticInt
实例变量。由于您没有保留对创建的实例的引用,因此您无法两次检索相同的实例变量,这使得它毫无用处。
如果您需要在 class 的所有实例之间共享一个变量的单个副本,static
变量是可行的方法。
也就是说,后一个调用也更广泛,因为它涉及创建和初始化 MyInstatnceClass
class 的实例(除了加载和初始化 class如果这是第一次访问 class)。
另一方面,如果 class 是 class 的第一次访问,MyStaticClass.getMyStaticInt()
只会加载和初始化 class MyStaticClass
。它不必创建 class.
因为实例方法可以是多态的overridden, a very naive JVM implementation must at least initially use a virtual mehod table to find the appropriate method to call. Classes themselves, however are not polymorphic and class methods cannot be overridden. Due to this, they have a simpler lookup mechanism。
但是,现实世界中的 JVM 非常聪明,可以判断哪些方法永远不会被覆盖并优化此查找。换句话说,除了最人为设计的不存在 JVM 的实例之外,在所有实例中,性能都会有所不同。相反,使用静态方法来表示与整个 class 对象本身相关的功能,而不是与其单个实例相关的功能。