使用final关键字真的能提高性能吗?
首先这里有一篇文章:
http://www.javamex.com/tutorials/java_final_performance.shtml
在这篇文章中,作者Neil Coffey说到了下面一些内容:
But to the best of my knowledge, there are no class/method optimisations in Hotspot based on whether or not a class or method is final. In a discussion with members of the Hotspot compiler team back in 2005, they confirmed this was already the case then.
这段话的大致意思是,据作者所知,在Hotspot中没有任何的优化是基于一个类或者一个方法是否是final的。在2005年与Hotspot开发团队的一次讨论中,他们证实了这种情况。
接着作者进行了一个性能测试,测试内容是先有一个基类BaseClass,在基类中定义一个方法A;然后定义三个子类:①ClassA 继承基类②ClassB继承基类并定义为final③classC继承基类,并且被其他类继承;三个子类分别用相同的内容覆写方法A。因为对于每个子类,使用时都有两种方式,例如
BaseClass classA = new ClassA();或
ClassA classA = new ClassA();
因此这里有6种调用方法A的方式,分别对比方法调用的耗时。
结果是:
结果表明,class是否由final修饰不会影响性能,同时第二种声明方法相对更高效,但是第二种有时不符合我们面向接口编程的原则,所以这里存在取舍。
对于final提高性能还有另一种可能,就是编译器倾向于将用final修饰的短方法内联(inline)。文中提到在早期的字节码编译器中错误地采取这种判断内联的方法,而在现代的Java编译器中不再这样。在Hotspot虚拟机中,它的优化是基于JIT技术,而不是基于你是否将方法标记为final。遗憾的是作者并没有对此进行测试,所以这里我们就自己来设计测试。代码如下
public class FinalVsNonFinal
{
private static final int TIMES = 10_0000;
public static void main(String[] args) {
FinalVsNonFinal o = new FinalVsNonFinal();
//多测试几次,看看情况
//输出时间的单位是毫秒
for(int i = 0; i < 4; i++) {
testFinal(o);
testNonFinal(o);
}
}
public final boolean methodA() {
return true;
}
public boolean methodB() {
return true;
}
public static void testFinal(FinalVsNonFinal o) {
long start = System.nanoTime();
for(int i = 0; i < TIMES; i++) {
o.methodA();
}
long duration = System.nanoTime() - start;
System.out.println("Final Method: " + duration/1.0e6);
}
public static void testNonFinal(FinalVsNonFinal o) {
long start = System.nanoTime();
for(int i = 0; i < TIMES; i++) {
o.methodB();
}
long duration = System.nanoTime() - start;
System.out.println("Non-Final Method: " + duration/1.0e6);
}
}
运行结果的截图是:
(我的jdk版本是jdk1.7.0_03,系统是windows 7,cpu是AMD turion RM75)
从上面的截图可以看出,final方法和non-final方法的耗时差不多,但是第1次双方都耗时较多,而后面2次的调用耗时越来越少。在这里,后几次时间的减少就是由于JIT技术,有兴趣的可以去了解下Java中的JIT技术。
综上所述, Java中的final关键字更多是用在设计上,而final关键字本身并不能带来性能的提升。
- 大小: 6.6 KB
分享到:
相关推荐
Java 中的 `final` 关键字是一个至关重要的概念,它被用来声明类、方法和变量,以确保它们在程序执行过程中不可更改。深入理解 `final` 关键字可以帮助开发者写出更加安全、高效的代码。 首先,`final` 关键字可以...
- Java虚拟机(JVM)可以对`final`字段进行优化,例如静态`final`字段会被内联,提高运行时性能。 - 对于对象引用,`final`关键字并不保证对象内的状态不可变,仅保证引用本身不变。因此,对于复杂对象,如果需要...
本篇文章将深入探讨`final`关键字在Java中的使用和重要性,帮助开发者更好地理解和应用这一关键特性。 首先,`final`关键字用于声明变量。当一个变量被声明为`final`时,它的值一旦被初始化,就不能再改变。这在...
在Java编程中,final关键字扮演...总结,final关键字在Java中主要起到了不可变性、防止继承和方法重写的作用,有助于代码的维护、性能优化和安全性。理解并恰当使用final,可以帮助开发者创建更加健壮和可预测的代码。
在实际编程中,正确使用`final`和`static`可以帮助提高代码的可读性、可维护性和性能。例如,`final`常量可以提供清晰的命名约定,表明这些值不应被更改。`static`方法和变量则降低了对对象实例的依赖,使得在不需要...
### Java零基础-final关键字 #### 内容概要 ...通过上述内容的学习和实践,读者不仅能够熟练掌握final关键字的使用方法,还能深刻理解其背后的原理和重要性,从而写出更安全、更高效的Java代码。
Java中的`final`关键字是一个非常重要的概念,它用于表示不可变性或终结状态。下面我们将详细探讨`final`关键字在修饰变量、方法和类时的不同用法。 1. **final变量** - 常量定义:`final`变量一旦被初始化后,其...
Java中的final关键字是一个非常重要的概念,它用于定义不可变性,确保对象或代码段的不可修改性。在Java中,final可以用来修饰类、方法、变量和参数,以实现特定的编程需求。以下是对final关键字在各个场景下用法的...
Java中的`final`关键字是一个非常重要的概念,它用于在编程中实现不同的限制和特性。`final`关键字可以应用于以下几个方面: 1. **final变量**:当一个变量被声明为`final`时,它成为了一个不可修改的常量。这意味...
在这个"java提高篇之关键字final编程开发技术共5页.pdf"的资料中,我们将会深入探讨`final`的关键特性和应用场景。 1. **不可变性**: `final`关键字可以应用于变量,一旦被声明并赋值后,就不能再更改。这在多...
### Final关键字详解 #### 一、Final的基本概念与作用 `final`关键字是Java语言中的一个重要的修饰符,它的含义非常直接——“最终”的意思。它可以在不同的上下文中发挥不同的作用,主要体现在以下三个方面: 1....
【Java并发--final关键字】 Java中的`final`关键字在编程中扮演着重要的角色,它可以用于修饰变量、方法和类,确保被修饰的内容在特定条件下不可变。以下将详细阐述`final`关键字在不同场景下的应用及其特点。 **...
final关键字在Java编程中的应用广泛,可以帮助提高代码的稳定性和可维护性。 1. **常量的声明** final关键字最常见的用法是声明常量。当一个变量被声明为final时,它的值一旦被赋值后就不能再改变。例如: ```...
同时,`final`方法有助于提高早期Java版本中的性能,因为它们可以被内联,但现在这个优化不再需要`final`关键字。 3. 修饰变量 `final`变量分为两种情况: - 基本类型变量:一旦赋值后,其值不可更改。 - 引用...
### Java中的final关键字详解 #### 一、final的概述与用途 `final`关键字在Java中扮演着重要的角色,它通常被用来表示“不可变”的特性。`final`可以用来修饰类、方法以及变量,其核心目的是为了保护数据的安全性...
4. **final关键字的好处** - 提高性能:JVM可以对`final`变量进行优化,因为它们的值是不可变的,这有助于提升程序执行速度。 - 多线程安全:`final`变量在多线程环境中可以直接共享,因为它们的值不会改变,从而...
### final关键字在Java中的应用与理解 #### 一、final关键字概述 `final`关键字是Java语言中的一个重要特性,主要用于定义不可变的对象、方法或变量等。通过使用`final`关键字,开发人员能够确保某些实体在初始化...
Java中的final关键字是一个非常重要的修饰符,它可以在类、方法和变量上使用,以实现不同的功能。以下是对final关键字的详细解释: 1. 修饰类 当final关键字用于修饰一个类时,这个类将无法被其他类继承。这意味着...