在类初始化期间计算不可变数据结果,并将结果保存在static final字段中是一种非常常见的做法。实际上,这正是静态初始化器的设计目标。

以下是在初始化时构建一些静态表的典型示例:

public class StaticExample {static final long[] TABLE = new long[100_000_000];static {TABLE[0] = 0;for (int i = 1; i < TABLE.length; i++) {TABLE[i] = nextValue(TABLE[i - 1]);}}private static long nextValue(long seed) {return seed * 0x123456789L + 11;}...
}
复制代码

在我的JDK 11.0.1笔记本电脑上,静态初始化程序在大约540毫秒内填充100M元素的数组。

现在让我们简单地删除static并填充构造函数中的数组。

public class NonStaticExample {final long[] TABLE = new long[100_000_000];{TABLE[0] = 0;for (int i = 1; i < TABLE.length; i++) {TABLE[i] = nextValue(TABLE[i - 1]);}}private static long nextValue(long seed) {return seed * 0x123456789L + 11;}public static void main(String[] args) {new NonStaticExample();}
}
复制代码

构造函数在138毫秒内填充类似的数组。几乎快4倍!

为什么静态初始化器会变慢?这必须与JIT编译有关。

解决方法非常简单:

只是不要直接在未初始化的类中进行繁重的计算。如果将计算逻辑放在没有静态初始化程序的辅助类中,它将不会受到性能损失的影响。

public class StaticExample {static final long[] TABLE = Helper.prepareTable();private static class Helper {static long[] prepareTable() {long[] table = new long[100_000_000];for (int i = 1; i < table.length; i++) {table[i] = nextValue(table[i - 1]);}return table;}static long nextValue(long seed) {return seed * 0x123456789L + 11;}}
}
复制代码

读者福利:

分享免费学习资料

针对于还会准备免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料) 为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

资料领取方式:加入Java技术交流群963944895,私信管理员即可免费领取

转载于:https://juejin.im/post/5cada9b5518825215d37b923

静态初始化中不能放入繁重计算,否则会变慢!相关推荐

  1. winfrom保存图片,将文件夹中图片放入listview,与撤回操作

    之前那些操作完成对图片的修改之后,就是要保存图片了. 这里保存用到一个SaveFileDialog控件,可以获取用户选择的保存文件的路径. if (pictureBox1.Image.Width &g ...

  2. HTML里面的head标签中可以放入什么

    HTML中 <head>标签里可以放入什么 1.<head> 标签用于定义文档的头部,它是所有头部元素的容器. 2.<head> 标签中的元素可以引用脚本.指示浏览 ...

  3. java中如何放入音乐文件

    一.将音乐播放的类放入包里 二.把文件目录确定下来 三.在MyPanel的构造器中启动AePlayWave的线程 附AePlayWave代码: public class AePlayWave exte ...

  4. Android Studio模拟机中如何放入图片

    打开模拟机相册,直接把图片拖入即可 可能不会立刻显示图片,过一会儿再打开即可看到

  5. java中怎么放入.jpg_Java如何设置jpg质量

    只是想编辑一些代码,以便输出jpg质量不是默认的低质量设置 try { ImageIO.write(var6, "jpg", var7); } -..正在使用. 我已经看了一些其他 ...

  6. linux定时任务执行脚本文件找不到,linux中脚本放入计划任务当中为什么没有执行呢?...

    如何搭建linux下c++开发环境 方法/步骤 1 1.下载 Linux 下的 Oracle Instant Client 有rpm包和zip包两种,下载任意一种即可,这里以下载的 zip 包为例,下 ...

  7. 将List中数据放入实体类中再放入List中(对List数据中进行分页处理)

    [java]  view plain  copy List<TagInfo> tagInfoList=new ArrayList<TagInfo>(); for(int j=0 ...

  8. python将对象放入列表根据某个属性排升序_对python 对象列表根据某个属性排序的方法...

    对于一个已有的python list, 里面的内容是一些对象,这些对象有一些相同的属性值, 在一些特定的情况下,需要自己选择特定的排序,也就是根据某一个具体的属性来排序,在网上找了下资料,一般来说有两 ...

  9. python将对象放入列表根据某个属性排升序_python实现对象列表根据某个属性排序的方法详解...

    本文实例讲述了python实现对象列表根据某个属性排序的方法.分享给大家供大家参考,具体如下: 对于一个已有的python list, 里面的内容是一些对象,这些对象有一些相同的属性值, 在一些特定的 ...

  10. 包+类导入+静态导入+类放入包中+包作用域

    [0]README 0.1)本文转自 core java volume 1, 旨在理清 包和类导入的相关知识: [1] 包 1.1) java 允许使用包将类组织起来,包可以方便组织代码,并将自己的代 ...

最新文章

  1. JavaScript基础(一) 数据类型
  2. 那篇《中国AI觉醒》的文章,让西方的吃瓜群众们对中国展开了疯狂膜拜…不信你看
  3. SQL优化常用方法49
  4. 判断一件事有无技术含量的标准
  5. html绘制圆形和弧形的代码,通过HTML5 Canvas API绘制弧线和圆形的教程
  6. python与c语言在语法上的区别-论c++/java/c 与python的语法上的区别
  7. Struts2数据传输的背后机制:ValueStack(值栈)
  8. LaTeX中警告类型及说明
  9. python开发config层_Python全栈开发:configparser模块
  10. c语言case怎么输入字母,如何使用switch case语句将字母转换为数字
  11. MySQL 事务的面试题总结
  12. UVa 10791 Minimum Sum LCM
  13. OpenCV2 图像叠加 给照片加水印
  14. chrome 无法下载文件软件问题
  15. 剑指offer题目大全
  16. Python 利用GDAL对图像进行几何校正
  17. RK系列SDK -- Android HFP蓝牙通话音频处理(蓝牙音箱方案)
  18. 二维码条形码生成打印软件C#源码,根据变量自动添加抬头
  19. WordPress 配置七牛云 CDN 具体操作
  20. Excel与Google Sheets中实现线性规划求解

热门文章

  1. fork: retry: Resource temporarily unavailable 解决方案
  2. oracle自定义函数返回结果集
  3. Parallel Computing–Cannon算法 (MPI 实现)
  4. Oct.31, 2011-减肥第一天
  5. 复杂场景下的多目标跟踪 --心得
  6. 如何解决Mac上隐藏红色通知标记?技巧来啦
  7. 制作Camtasia 2020击键标记动画——保存及应用
  8. Spring Cloud入门教程-Ribbon实现客户端负载均衡
  9. shell基础--1
  10. linux下led灯驱动程序