Java中利用final关键字inline编译优化真的有效吗?

简介:

(inkfish原创,转载请注明出处:http://blog.csdn.net/inkfish/)

  为寻求java代码的性能优化,从网上搜到利用final关键字进行编译时inline优化的方法,但是真的有效吗?实际测试中发现未必,甚至性能影响巨大,最终放弃了使用final优化的想法。

  测试环境:Windows XP SP2,JDK 1.6.0_15-b03,Eclipse 3.5 SR1。

 

package test; public class Test { public static void main(String[] args) { int loop = 10000000;//测试1000万循环 String num = "0"; //----第一遍---- { System.out.print("第一遍:/t"); long start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class1 c1 = new Class1(); c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class2 c2 = new Class2(); c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class1 c1 = new Class1(); for (int i = 0; i < loop; i++) { c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class2 c2 = new Class2(); for (int i = 0; i < loop; i++) { c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); } //----第二遍---- { System.out.print("/n第二遍:/t"); long start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class1 c1 = new Class1(); c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class2 c2 = new Class2(); c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class1 c1 = new Class1(); for (int i = 0; i < loop; i++) { c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class2 c2 = new Class2(); for (int i = 0; i < loop; i++) { c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); } //----第三遍---- { System.out.print("/n第三遍:/t"); long start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class1 c1 = new Class1(); c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); for (int i = 0; i < loop; i++) { Class2 c2 = new Class2(); c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class1 c1 = new Class1(); for (int i = 0; i < loop; i++) { c1.setF1(num); c1.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); Class2 c2 = new Class2(); for (int i = 0; i < loop; i++) { c2.setF1(num); c2.getF1(); } System.out.printf("%5dms", (System.currentTimeMillis() - start)); } } } class Class1 { private String f1; public String getF1() { return f1; } public void setF1(String f1) { this.f1 = f1; } } final class Class2 { private String f1; public final String getF1() { return f1; } public final void setF1(String f1) { this.f1 = f1; } }

运行结果:

第一遍: 110ms 1203ms 16ms 156ms 第二遍: 94ms 1203ms 15ms 141ms 第三遍: 94ms 1203ms 15ms 141ms

 

总结:

1.利用final进行inline优化无效;

2.有时候结果往往出乎多数人预料。

 

 

目录
相关文章
|
18天前
|
存储 缓存 算法
优化 Java 后台代码的关键要点
【4月更文挑战第5天】本文探讨了优化 Java 后台代码的关键点,包括选用合适的数据结构与算法、减少不必要的对象创建、利用 Java 8 新特性、并发与多线程处理、数据库和缓存优化、代码分析与性能调优、避免阻塞调用、JVM 调优以及精简第三方库。通过这些方法,开发者可以提高系统性能、降低资源消耗,提升用户体验并减少运营成本。
|
19天前
|
Java 开发工具 流计算
flink最新master代码编译出现Java Runtime Environment 问题
在尝试编译Flink源码时遇到Java运行时环境致命错误:EXCEPTION_ACCESS_VIOLATION。问题出现在JVM.dll+0x88212。使用的是Java 11.0.28和Java HotSpot(TM) 64-Bit Server VM。系统为Windows客户端,没有生成核心dump文件。错误日志保存在hs_err_pid39364.log和replay_pid39364.log。要解决这个问题,建议检查JDK版本兼容性,更新JDK或参照错误报告文件提交Bug至http://bugreport.java.com/bugreport/crash.jsp。
|
17天前
|
设计模式 安全 Java
Java并发编程实战:使用synchronized关键字实现线程安全
【4月更文挑战第6天】Java中的`synchronized`关键字用于处理多线程并发,确保共享资源的线程安全。它可以修饰方法或代码块,实现互斥访问。当用于方法时,锁定对象实例或类对象;用于代码块时,锁定指定对象。过度使用可能导致性能问题,应注意避免锁持有时间过长、死锁,并考虑使用`java.util.concurrent`包中的高级工具。正确理解和使用`synchronized`是编写线程安全程序的关键。
|
20天前
|
Java
深入理解Java并发编程:线程池的应用与优化
【4月更文挑战第3天】 在Java并发编程中,线程池是一种重要的资源管理工具,它能有效地控制和管理线程的数量,提高系统性能。本文将深入探讨Java线程池的工作原理、应用场景以及优化策略,帮助读者更好地理解和应用线程池。
|
4天前
|
安全 Java 开发者
Java并发编程:深入理解Synchronized关键字
【4月更文挑战第19天】 在Java多线程编程中,为了确保数据的一致性和线程安全,我们经常需要使用到同步机制。其中,`synchronized`关键字是最为常见的一种方式,它能够保证在同一时刻只有一个线程可以访问某个对象的特定代码段。本文将深入探讨`synchronized`关键字的原理、用法以及性能影响,并通过具体示例来展示如何在Java程序中有效地应用这一技术。
|
6天前
|
Java 开发者
Java中多线程并发控制的实现与优化
【4月更文挑战第17天】 在现代软件开发中,多线程编程已成为提升应用性能和响应能力的关键手段。特别是在Java语言中,由于其平台无关性和强大的运行时环境,多线程技术的应用尤为广泛。本文将深入探讨Java多线程的并发控制机制,包括基本的同步方法、死锁问题以及高级并发工具如java.util.concurrent包的使用。通过分析多线程环境下的竞态条件、资源争夺和线程协调问题,我们提出了一系列实现和优化策略,旨在帮助开发者构建更加健壮、高效的多线程应用。
6 0
|
7天前
|
SQL 缓存 Java
Java数据库连接池:优化数据库访问性能
【4月更文挑战第16天】本文探讨了Java数据库连接池的重要性和优势,它能减少延迟、提高效率并增强系统的可伸缩性和稳定性。通过选择如Apache DBCP、C3P0或HikariCP等连接池技术,并进行正确配置和集成,开发者可以优化数据库访问性能。此外,批处理、缓存、索引优化和SQL调整也是提升性能的有效手段。掌握数据库连接池的使用是优化Java企业级应用的关键。
|
8天前
|
Java
Java关键字(1)
Java关键字(1)
|
9天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
10天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
13 4

热门文章

最新文章