- 浏览: 2570163 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (880)
- 每日总结 (26)
- java (37)
- lucene 2.4源码学习 (11)
- 庖丁分词的源码分析 (5)
- cindy源码阅读 (10)
- jetty (3)
- java基础 (49)
- hadoop (37)
- python (7)
- 那些蛋疼的事 (15)
- 测试 (5)
- spring (3)
- redis (4)
- git (4)
- 我的开源项目 (2)
- linux (15)
- mysql (8)
- bootsharp (1)
- idea (1)
- Disruptor源码分析 (11)
- 高并发 (22)
- jdk (4)
- 领域驱动 (1)
- 坑 (6)
- 表达式框架 (7)
- 游戏 (3)
- Guava (1)
- 缓存 (1)
- 数据库 (1)
- 游戏项目 (3)
- java8 (1)
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
Calendar.getInstance()看起来应该是个单例,但实际上并不是。
一次在JProfile中查看CPU的消耗的时候,发现 Calendar.getInstance() 消耗的CPU占比比较大,具体看了下代码才发现实际上是每次都创建对象的。
public static Calendar getInstance(TimeZone zone, Locale aLocale) { return createCalendar(zone, aLocale); } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { CalendarProvider provider = LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) .getCalendarProvider(); if (provider != null) { try { return provider.getInstance(zone, aLocale); } catch (IllegalArgumentException iae) { // fall back to the default instantiation } } Calendar cal = null; if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { switch (caltype) { case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } } if (cal == null) { // If no known calendar type is explicitly specified, // perform the traditional way to create a Calendar: // create a BuddhistCalendar for th_TH locale, // a JapaneseImperialCalendar for ja_JP_JP locale, or // a GregorianCalendar for any other locales. // NOTE: The language, country and variant strings are interned. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") { cal = new BuddhistCalendar(zone, aLocale); } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" && aLocale.getCountry() == "JP") { cal = new JapaneseImperialCalendar(zone, aLocale); } else { cal = new GregorianCalendar(zone, aLocale); } } return cal; }
代码中可以清楚的看到是每次都创建的。
那么创建对象的成本怎么样呢?
public static void main(String[] args) { int runs = 10000; long start = System.nanoTime(); Calendar cal = null; for(int i=0;i<runs;i++) cal = Calendar.getInstance(); long time = System.nanoTime() - start; System.out.println("Calendar.getInstance() took on average "+time/runs+" ns. "+cal); long start2 = System.nanoTime(); long now = 0; for(int i=0;i<runs;i++) now = System.currentTimeMillis(); long time2 = System.nanoTime() - start2; System.out.println("System.currentTimeMillis() took on average "+time2/runs+" ns. "+now); }
测试结果:
Calendar.getInstance() took on average 8264 ns. java.util.GregorianCalendar[time=1481014104709,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Chongqing",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=341,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=48,SECOND=24,MILLISECOND=709,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.currentTimeMillis() took on average 105 ns. 1481014104711
可以看到是System.currentTimeMillis()的80多倍。性能其实是很差了的。
建议Calendar对象可以缓存起来,不用每次都创建。
具体的讨论在stackoverflow上也有: http://stackoverflow.com/questions/4587878/creating-java-object-general-question
发表评论
-
获取字符长度的正确姿势
2017-05-23 16:09 1076public static void main(String[ ... -
解决tomcat中反序列化找不到class
2017-05-19 09:59 2086tomcat反序列化的过程中一直报ClassNotFoundE ... -
java的sun.jnu.encoding有什么用
2017-02-10 15:45 5383目前看到的影响有两个:影响类名的读取和Main方法参数的读取。 ... -
jsckson序列化处理泛型
2017-01-10 15:02 3264我有这样两个类 package com.vipshop. ... -
Quartz 1.8.0版本的死锁问题
2017-01-05 15:04 5648先说问题的结论:https:/ ... -
java的double乘法精度问题
2016-12-22 09:31 5520项目中实际的代码,我们实际的金额单位是元,精确到分,另外一个系 ... -
针对jquery的when方法做的应变
2016-10-13 17:09 1065需求:a,b两个任务都处理(不管a,b是成功还是失败)后,执行 ... -
http的501错误
2016-10-09 15:37 8594普通的url请求是get put之类的,如果是乱七八糟的,比如 ... -
java对象初始化的顺序
2016-10-08 17:18 981public class Son extends F ... -
java线程池自己掉进去的坑
2016-08-18 17:59 2082java线程池的maximumPoolSize的生效条件真的是 ... -
java序列化框架性能比较
2016-05-24 09:22 32151. Kryo 2. FST 3. java 原生序列化 ... -
java 关闭main方法中的定时器线程(2)
2016-05-20 15:49 1772import java.util.concurrent ... -
java 关闭main方法中的定时器线程
2016-05-20 15:29 1171public class TestTreadClose { ... -
java比AtomicLong 更高效的LongAdder
2016-04-14 21:05 3183AtomicLong 是通过cas来实现的,已经很高效了,还有 ... -
java避免缓存伪共享
2016-04-14 20:15 903java8之前的做法: 加6个无用的long字段 如: ... -
java重复批次执行
2015-04-21 20:39 1464方案1 使用Phaser 方案2 使用CyclicBarr ... -
两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。
2015-04-21 17:13 3895两个线程,分别打印[1,3,5]和[2,4,6],写一个程序, ... -
mina实现相同session后到的请求一定后处理的原理
2015-03-26 22:04 3703mina后面的业务处理是一个线程池去处理的,在线程池的多线程的 ... -
简单实现一个java公平策略的锁
2015-03-24 21:40 1365代码是: package com.eyu.gift.loc ... -
对java的BitSet的多线程并发的探索
2015-03-23 14:45 4126java的BitSet不是线程安全的,所以多线程的时候h要加锁 ...
相关推荐
NULL 博文链接:https://ollevere.iteye.com/blog/1320854
格式与电脑日历一致,包括从1970年至今。
实际上,在历史上有着许多种纪元的方法。它们的差异实在太大了,比如说一个...我们从 Calendar.getInstance() 中所获得的实例就是一个 \"GreogrianCalendar\" 对象(与您通过 new GregorianCalendar() 获得的结果一致)。
2.Calendar和Date的转化 (1) Calendar转化为Date Calendar cal=Calendar.getInstance(); Date date=cal.getTime(); (2) Date转化为Calendar Date date=new Date(); Calendar cal=Calendar.getInstance(); cal.set...
Java中Calendar类.pdf 学习资料 复习资料 教学资源
Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); Date currMonthFirst = calendar.getTime(); return ...
开发过程中,我常常先编写方法,如Calendar.getInstance(),然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量之上。 这样我节省了输入类名,变量名以及导入声明的时间。Ctrl+F的效果类似,不过效果是把方法...
Calendar c = Calendar.getInstance(); //取得年月日,小时分秒 int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH)+1; int day = c.get(Calendar.DATE); int hour = c.get(Calendar....
import java.util.Calendar; import java.util.Date; import javax.microedition.rms.RecordStoreException; /* * 创建日期 2006-12-6 * * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - Java - ...
calendar=Calendar.getInstance(); alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE); } public void myclick(View v){ new TimePickerDialog(MainActivity.this, 0, new ...
AndroidSkin.getInstance().saveSkinAndApply(skinFilePath, SkinLoader.ASSETS); 执行之后,app即完成换肤,你将看到华丽的换肤效果; Demo Usage 1、在 app/buil.gradle 添加 compile '...
Calendar now = Calendar.getInstance(); now.setTime(date); int today = now.get(Calendar.DAY_OF_WEEK); int first_day_of_week = now.get(Calendar.DATE) + 2 - today; // 星期一 now.set(Calendar....
final Calendar c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get(Calendar.DAY_OF_MONTH); mHour = c.get(Calendar.HOUR_OF_DAY); ...
KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(128); Cipher cipher = Cipher.getInstance(ALGORITHMSTR); //"算法/模式/补码方式" SecretKeySpec skeySpec = new SecretKeySpec...
日历calendar详细代码
public static String md5(String str) { try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte b[] = md.digest();
import java.util.Calendar; class TestClassCalendar{ public static void main(String args[]){ Calendar mycalendar1 = Calendar.getInstance(); System.out.println("今日日期: "); System.out....
import java.util.Calendar; class TestClassCalendar{ public static void main(String args[]){ Calendar mycalendar1 = Calendar.getInstance(); System.out.println("今日日期: "); System.out....
Calendar calendar = Calendar.getInstance(); calendar.set(yearOne,monthOne-1,dayOne); long timeOne = calendar.getTimeInMillis(); calendar.set(yearTwo,monthTwo-1,dayTwo); long timeTwo = calendar....
使用java.util.Calendar类,通过Calendar.getInstance()可以获得当前系统的日期和时间; 通过Calendar对象的set()方法可以修改Calendar对象的年月日等信息; 通过Calendar对象的get(Calendar.DAY_OF_WEEK)方法可以...