性能优化之抛弃Calendar

转载自  性能优化之抛弃Calendar

目前在做限流相关的需求,有这么一个限流策略,和用户相关,当系统发生故障时,允许一个非核心接口按照用户的百分比进行限流,如果完全按照UUID进行hash,那么每次都是限制同一批的用户,如果在UUID的基础上加上当天的日期,那么就可以有效的避免这个问题。

所以在这个需求中,每次请求都需要拿到当前的日期,不过精确到天即可。 嗖~的一下,完成了如下代码

Calendar calendar = Calendar.getInstance();
String time = "" + calendar.get(Calendar.YEAR) + calendar.get(Calendar.MONTH) 
+ calendar.get(Calendar.DAY_OF_MONTH);

很简单是不是,不过写完之后,很快就被业务同学diss了,Calendar性能太差了,在QPS很高的情况下,会使接口的999线劣化。

 

QPS高的业务真是惹不起... (丢)

为什么Calendar不行,因为每次请求都要创建一个Calendar实例,这个创建过程比较的耗时(qps低的时候可以忽略这种消耗),但是做基础组件的,应该考虑各种场景。

因为只需要获取到与天相关数据,所以想到了另一个简单的解决方案

private static final int DAY_MILLIS = 24 * 60 * 60 * 1000;
long day = System.currentTimeMillis() / DAY_MILLIS;

通过当前的时间戳(毫秒级别),除以一天的毫秒数,得到的结果就是从1970 到今天经历过的天数,这完全符合当前的需求。

这个解决方案,只是恰好可以满足这种需求,对于其它更复杂一点的需求,我这里推荐使用 JodaTime组件。

下面通过Openjdk的JMH类库,对上述三种情况进行性能基准测试,还没有接触过JMH的同学,可以在官网上进行学习,传送门

@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.AverageTime)
public class Main {static int millis = 24 * 3600 * 1000;public static void main(String[] args) throws Exception {Options options = new OptionsBuilder().include(Main.class.getName()).forks(1).build();new Runner(options).run();}@Benchmark@Threads(5)public void runCalendar() {Calendar calendar = Calendar.getInstance();}@Benchmark@Threads(5)public void runJoda() {DateTime dateTime = new DateTime();}//@Benchmark@Threads(5)public void runSystem() {long result = System.currentTimeMillis() / millis;}}

使用benchmark之前,需要引入相关依赖

<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>1.21</version>
</dependency>
<dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>1.21</version><scope>provided</scope>
</dependency>

 

 

最终结果如下

这里只是测试了Calendar和Joda对象的创建耗时,可以发现Joda的性能比Calendar整整高了10倍,真的不可忽略。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于.net的微服务架构下的开发测试环境运维实践

眼下&#xff0c;做互联网应用&#xff0c;最火的架构是微服务&#xff0c;最热的研发管理就是DevOps&#xff0c; 没有之一。微服务、DevOps已经被大量应用&#xff0c;它们已经像传说中的那样&#xff0c;可以无所不能。特来电云平台&#xff0c;通过近两年多的实践&#xff…

洛谷P3845-球赛【离散化,贪心】

正题 题目连接&#xff1a; https://www.luogu.org/problemnew/show/P3845 AC信息&#xff1a; https://www.luogu.org/record/show?rid6955910 大意 有一些比分记录&#xff0c;不过双方可能会搞反&#xff08;如1−21−2可能会记录成2−12−1&#xff09;求这之间至少有…

挺详细的spring+springmvc+mybatis配置整合|含源代码

大家好&#xff0c;我是雄雄&#xff0c;今天来带着大家来配置一下SSM&#xff08;springspringmvcmybatis&#xff09;框架。01新建java web项目直接在myeclipse中&#xff0c;新建一个web项目即可。02导入jar包将SSM所需的jar包复制到项目的/WebRoot/WEB-INF/lib中&#xff0…

Java中如何实现线程的超时中断

转载自 Java中如何实现线程的超时中断 背景 之前在实现熔断降级组件的时候&#xff0c;需要实现接口请求的超时中断。意思是&#xff0c;业务在使用熔断降级功能时&#xff0c;在平台上设置了一个超时时间&#xff0c;如果请求进入熔断器开始计时&#xff0c;接口在超时时间…

GDOI2018-《被虐记》

序章 五一劳动节当然是来劳动的啦&#xff01;于是乎五一就变成一件不存在的事&#xff0c;放学那天的中午就坐车去中山了。 然后睡了一会就快到了&#xff0c;下了高速&#xff0c;突然想起来这次带来手机就照了一张照。然后就到酒店了。附近也有挺多吃的&#xff0c;酒店一…

DDD理论学习系列(10)-- 聚合

1.引言 聚合&#xff0c;最初是UML类图中的概念&#xff0c;表示一种强的关联关系&#xff0c;是一种整体与部分的关系&#xff0c;且部分能够离开整体而独立存在&#xff0c;如车和轮胎。 在DDD中&#xff0c;聚合也可以用来表示整体与部分的关系&#xff0c;但不再强调部分…

#面试!,一定要注意,避免踩这些雷!!

大家好&#xff0c;我是雄雄。前言今天&#xff0c;对2班的同学们进行了模拟面试&#xff0c;由于学生们第一次参与模拟面试&#xff0c;所以会出现各种各样的问题&#xff0c;有应该出的&#xff0c;也有不该出的&#xff0c;现在做个简单的总结&#xff0c;供三班的孩子们参考…

一次动态代理的填坑之旅

转载自 一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能&#xff0c;比较好的方式是通过注解的方式&#xff0c;并基于动态代理进行实现&#xff0c;下面代码是Rhino的实现 Rhino public class ServiceImpl {Degrade(rhinoKey "syncMethod-0&…

3班的第一次模拟面试

大家好&#xff0c;我是雄雄&#xff0c;前几天总结了下面试别的班时所出现的问题&#xff0c;今天&#xff0c;3班进行了第一次模拟面试。虽然在面试之前千叮咛万嘱咐&#xff0c;但是在正式模拟面试时还是有些问题。一方面由于这样的模拟面试以前没有过&#xff0c;所以紧张过…

漫画:如何实现大整数相加

转载自 漫画&#xff1a;如何实现大整数相加 在程序中列出的 “竖式” 究竟是什么样子呢&#xff1f;我们以 426709752318 95481253129 为例&#xff0c;来看看大整数相加的详细步骤&#xff1a; 第一步&#xff0c;把整数倒序存储&#xff0c;整数的个位存于数组0下标位置&…

ssl2644-线段树练习1【线段树】

正题 题意 一块长m的墙&#xff0c;有n个大小不同的盒子放在前面&#xff0c;求没有被挡住的墙的总长度 解题思路 用线段树&#xff0c;0表示有没被遮挡的&#xff0c;1表示完全被遮挡&#xff0c;-1表示有遮挡的和没遮挡的。然后记数。 代码 #include<cstdio> usin…

Entity Framework Core 执行SQL语句和存储过程

无论ORM有多么强大&#xff0c;总会出现一些特殊的情况&#xff0c;它无法满足我们的要求。在这篇文章中&#xff0c;我们介绍几种执行SQL的方法。 表结构 在具体内容开始之前&#xff0c;我们先简单说明一下要使用的表结构。 public class Category{ public …

我去,终于解决了!

大家好&#xff0c;我是雄雄。今天给大家带来的是【IntelliJ IDEA中配置SSM框架总是报错&#xff0c;启动不了Tomcat的解决方法】。前言以前不管是在开发还是在授课&#xff0c;使用的软件要么是eclipse&#xff0c;要么就是myeclipse&#xff0c;最近听闻身边的人都在用idea,并…

EF Core 插件 —— ToSql

背景 在使用Entity Framework Core进行开发时&#xff0c;若不使用Logger很难查看到一个查询的SQL语句&#xff0c;同时也有些开发者因为不了解EF Core哪些Linq可以Translate成SQL&#xff0c;哪些不能而踩坑导致全表查询的&#xff0c;因此开发了Pomelo.EntityFrameworkCore.…

如何在idea中使用jstl标签库

大家好&#xff0c;我是雄雄&#xff0c;上期我们解决了个bug&#xff0c;详情点击这里&#xff1a;我去&#xff0c;终于解决了 &#xff0c;今天&#xff0c;我们来看看【如何在idea中使用jstl标签库】前言&#xff1a;像myeclipse和eclipse这种编辑器&#xff0c;jstl标签库…

ssl2645-线段树练习2【线段树】

正题 题意 一块长m的墙&#xff0c;有n个大小不同的盒子放在前面&#xff0c;求可以看到多少盒子 解题思路 用线段树&#xff0c;用cover表示可以看到的颜色&#xff0c;-1表示可以看到多种颜色&#xff0c;然后统计&#xff0c;用find数组去重。 代码 #include<cstdio…