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.有时候结果往往出乎多数人预料。

 

 

目录
相关文章
|
1月前
|
监控 算法 Java
Java虚拟机(JVM)垃圾回收机制深度剖析与优化策略####
本文作为一篇技术性文章,深入探讨了Java虚拟机(JVM)中垃圾回收的工作原理,详细分析了标记-清除、复制算法、标记-压缩及分代收集等主流垃圾回收算法的特点和适用场景。通过实际案例,展示了不同GC(Garbage Collector)算法在应用中的表现差异,并针对大型应用提出了一系列优化策略,包括选择合适的GC算法、调整堆内存大小、并行与并发GC调优等,旨在帮助开发者更好地理解和优化Java应用的性能。 ####
57 0
|
2天前
|
Java 编译器 开发者
Java中的this关键字详解:深入理解与应用
本文深入解析了Java中`this`关键字的多种用法
28 9
|
29天前
|
存储 缓存 Java
Java 并发编程——volatile 关键字解析
本文介绍了Java线程中的`volatile`关键字及其与`synchronized`锁的区别。`volatile`保证了变量的可见性和一定的有序性,但不能保证原子性。它通过内存屏障实现,避免指令重排序,确保线程间数据一致。相比`synchronized`,`volatile`性能更优,适用于简单状态标记和某些特定场景,如单例模式中的双重检查锁定。文中还解释了Java内存模型的基本概念,包括主内存、工作内存及并发编程中的原子性、可见性和有序性。
Java 并发编程——volatile 关键字解析
|
12天前
|
JSON Java 数据挖掘
利用 Java 代码获取淘宝关键字 API 接口
在数字化商业时代,精准把握市场动态与消费者需求是企业成功的关键。淘宝作为中国最大的电商平台之一,其海量数据中蕴含丰富的商业洞察。本文介绍如何通过Java代码高效、合规地获取淘宝关键字API接口数据,帮助商家优化产品布局、制定营销策略。主要内容包括: 1. **淘宝关键字API的价值**:洞察用户需求、优化产品标题与详情、制定营销策略。 2. **获取API接口的步骤**:注册账号、申请权限、搭建Java开发环境、编写调用代码、解析响应数据。 3. **注意事项**:遵守法律法规与平台规则,处理API调用限制。 通过这些步骤,商家可以在激烈的市场竞争中脱颖而出。
|
28天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
35 6
|
29天前
|
缓存 安全 Java
Java volatile关键字:你真的懂了吗?
`volatile` 是 Java 中的轻量级同步机制,主要用于保证多线程环境下共享变量的可见性和防止指令重排。它确保一个线程对 `volatile` 变量的修改能立即被其他线程看到,但不能保证原子性。典型应用场景包括状态标记、双重检查锁定和安全发布对象等。`volatile` 适用于布尔型、字节型等简单类型及引用类型,不适用于 `long` 和 `double` 类型。与 `synchronized` 不同,`volatile` 不提供互斥性,因此在需要互斥的场景下不能替代 `synchronized`。
2170 3
|
1月前
|
存储 监控 小程序
Java中的线程池优化实践####
本文深入探讨了Java中线程池的工作原理,分析了常见的线程池类型及其适用场景,并通过实际案例展示了如何根据应用需求进行线程池的优化配置。文章首先介绍了线程池的基本概念和核心参数,随后详细阐述了几种常见的线程池实现(如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等)的特点及使用场景。接着,通过一个电商系统订单处理的实际案例,分析了线程池参数设置不当导致的性能问题,并提出了相应的优化策略。最终,总结了线程池优化的最佳实践,旨在帮助开发者更好地利用Java线程池提升应用性能和稳定性。 ####
|
1月前
|
存储 Java
Java 11 的String是如何优化存储的?
本文介绍了Java中字符串存储优化的原理和实现。通过判断字符串是否全为拉丁字符,使用`byte`代替`char`存储,以节省空间。具体实现涉及`compress`和`toBytes`方法,前者用于尝试压缩字符串,后者则按常规方式存储。代码示例展示了如何根据配置决定使用哪种存储方式。
|
1月前
|
存储 算法 Java
Java 内存管理与优化:掌控堆与栈,雕琢高效代码
Java内存管理与优化是提升程序性能的关键。掌握堆与栈的运作机制,学习如何有效管理内存资源,雕琢出更加高效的代码,是每个Java开发者必备的技能。
75 5
|
1月前
|
存储 监控 算法
Java虚拟机(JVM)垃圾回收机制深度解析与优化策略####
本文旨在深入探讨Java虚拟机(JVM)的垃圾回收机制,揭示其工作原理、常见算法及参数调优方法。通过剖析垃圾回收的生命周期、内存区域划分以及GC日志分析,为开发者提供一套实用的JVM垃圾回收优化指南,助力提升Java应用的性能与稳定性。 ####