stopwatch

为什么阿里巴巴禁止使用Apache Beanutils进行属性的copy?

邮差的信 提交于 2020-09-30 14:51:49
在日常开发中,我们经常需要给对象进行赋值,通常会调用其set/get方法,有些时候,如果我们要转换的两个对象之间属性大致相同,会考虑使用属性拷贝工具进行。 如我们经常在代码中会对一个数据结构封装成DO、SDO、DTO、VO等,而这些Bean中的大部分属性都是一样的,所以使用属性拷贝类工具可以帮助我们节省大量的set和get操作。 市面上有很多类似的工具类,比较常用的有 1、Spring BeanUtils 2、Cglib BeanCopier 3、Apache BeanUtils 4、Apache PropertyUtils 5、Dozer 那么,我们到底应该选择哪种工具类更加合适呢?为什么阿里巴巴Java开发手册中提到禁止使用Apache BeanUtils呢? 由于篇幅优先,关于这几种工具类的用法及区别,还有到底是什么是浅拷贝和深拷贝不在本文的讨论范围内。 本文主要聚焦于对比这几个类库的性能问题。 性能对比 No Data No BB,我们就来写代码来对比下这几种框架的性能情况。 代码示例如下: 首先定义一个PersonDO类: public class PersonDO { private Integer id; private String name; private Integer age; private Date birthday; //省略setter/getter

Java Timer - Updating Labels with Platform.runLater

岁酱吖の 提交于 2020-08-20 11:16:27
问题 This code sample is part of a Stopwatch class that is part of a larger project that is meant to be a desktop gui app that models after Android's Clock. I have labels for seconds, minutes, hours, etc. that are supposed to be updated from an infinite while loop that is inside a timer task which is ran while a boolean state is true. The while loop is supposed to update the GUI labels with the real time. I have the timer task execute every millisecond. Why does my GUI hang as soon as the program

ThreadPoolTaskScheduler手写任务调度

安稳与你 提交于 2020-08-19 00:54:27
先贴一个自己写的demo把,原理其实就是这样的。 先记录一个东西,后续来研究:CronSequenceGenerator 报错:Cron expression must consist of 6 fields,这玩意支持6位不支持7位,真是XXXX,quartz支持,参见 https://my.oschina.net/uwith/blog/4395339 。 CronTrigger这个类可以将cron表达式转换成Date,可以查看schedule源码学到不少东西,下面代码就是转换成下一执行时间。 public Date nextExecutionTime (TriggerContext triggerContext) @Slf4j @RestController public class HomeController { /** * 存储调度器信息 , 存在多线程安全问题 , 采用 ConcurrentHashMap * 初始大小设定大于核心线程池数量 3 倍即可 */ private Map<Integer , ScheduledFuture> map = new ConcurrentHashMap<>( 64 ) ; ThreadPoolTaskScheduler threadPoolTaskScheduler ; public HomeController () { //

Spring Boot 中的 Tomcat 是如何启动的?

江枫思渺然 提交于 2020-08-16 16:03:42
作者:木木匠 https://my.oschina.net/luozhou/blog/3088908 我们知道 Spring Boot 给我们带来了一个全新的开发体验,让我们可以直接把 Web 程序打包成 jar 包直接启动,这得益于 Spring Boot 内置了容器,可以直接启动。 本文将以 Tomcat 为例,来看看 Spring Boot 是如何启动 Tomcat 的,同时也将展开学习下 Tomcat 的源码,了解 Tomcat 的设计。 从 Main 方法说起 用过 Spring Boot 的人都知道,首先要写一个 main 方法来启动: @SpringBootApplication public class TomcatdebugApplication { public static void main(String\[\] args) { SpringApplication.run(TomcatdebugApplication.class, args); } } 我们直接点击run方法的源码,跟踪下来,发现最终的 run 方法是调用 ConfigurableApplicationContext 方法,源码如下: public ConfigurableApplicationContext run(String... args) { StopWatch stopWatch

C#分组方式比较

ぐ巨炮叔叔 提交于 2020-08-16 14:25:41
测试方法: private static void Main(string[] args) { var list = new List<Person>(); for (int i = 0; i < 1000000; i++) { list.Add(new Person() { Age = 18, Name = "老石" }); } var time1 = Time(() => { list.GroupBy(t => new { t.Age, t.Name }) .Select(t => t.FirstOrDefault()) .ToList(); }); Console.WriteLine($"分组耗时:{time1}"); var time2 = Time(() => { list.Distinct(d => new { d.Age, d.Name }).ToList(); }); Console.WriteLine($"HashSet耗时:{time2}"); var time3 = Time(() => { list.Distinct((a, b) => a.Age == b.Age && a.Name == b.Name).ToList(); }); Console.WriteLine($"委托耗时:{time3}"); } static long Time(Action

spring boot到底干了啥(一)

不想你离开。 提交于 2020-08-15 23:22:21
前言 对于服务端开发来说,新项目大多数都会基于spring boot进行开发。 而是用spring boot的项目一般都会有这么一行代码 SpringApplication.run(TestApplication.class, args); 这是Spring boot框架载入的地方。心血来潮,想看看它到底做了些什么。 new SpringApplication(primarySources)) run 方法会首先创建一个 SpringApplicaition对象,而primarySources 就是我们run方法的第一个参数,比如 TestApplication.class public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) { this.sources = new LinkedHashSet(); this.bannerMode = Mode.CONSOLE; this.logStartupInfo = true; this.addCommandLineProperties = true; this.addConversionService = true; this.headless = true; this.registerShutdownHook = true;

Spring AOP学习笔记05:AOP失效的罪因

廉价感情. 提交于 2020-08-14 03:13:17
  前面的文章中我们介绍了Spring AOP的简单使用,并从源码的角度学习了其底层的实现原理,有了这些基础之后,本文来讨论一下Spring AOP失效的问题,这个问题可能我们在平时工作中或多或少也会碰到。这个话题应该从同一个对象内的嵌套方法调用拦截失效说起。 1. 问题的现象   假设我们有如下对象类定义(同一对象内方法嵌套调用的目标对象示例): public class NestableInvocationDemo { public void method1(){ method2(); System. out .println( " method1 executed! " ); } public void method2(){ System. out .println( " method2 executed! " ); } }   这个类定义中需要我们关注的是它的某个方法会调用同一对象上定义的其他方法。这通常是比较常见的,在NestableInvocationDemo类中,method1()方法调用了同一个对象的method2()方法。   现在,我们要使用Spring AOP拦截该类定义的method1()和method2()方法,比如一个简单的性能检测,我们定义一个Aspect: @Aspect public class PerformanceTraceAspect {

SpringBoot2 | SpringBoot启动流程源码分析(一)

前提是你 提交于 2020-08-13 19:17:00
SpringBoot2 | SpringBoot启动流程源码分析(一) SpringBoot2 | SpringBoot启动流程源码分析(二) SpringBoot2 | @SpringBootApplication注解 自动化配置流程源码分析(三) SpringBoot2 | SpringBoot Environment源码分析(四) SpringBoot2 | SpringBoot自定义AutoConfiguration | SpringBoot自定义starter(五) SpringBoot2 | SpringBoot监听器源码分析 | 自定义ApplicationListener(六) SpringBoot2 | 条件注解@ConditionalOnBean原理源码深度解析(七) SpringBoot2 | Spring AOP 原理源码深度剖析(八) SpringBoot2 | SpingBoot FilterRegistrationBean 注册组件 | FilterChain 责任链源码分析(九) SpringBoot2 | BeanDefinition 注册核心类 ImportBeanDefinitionRegistrar (十) SpringBoot2 | Spring 核心扩展接口 | 核心扩展方法总结(十一) 概述:

.Net 并发写入文件的多种方式

笑着哭i 提交于 2020-08-13 17:02:24
1、简介 本文主要演示日常开发中利用多线程写入文件存在的问题,以及解决方案,本文使用最常用的日志案例! 2、使用File.AppendAllText写入日志 这是种常规的做法,通过File定位到日志文件所在位置,然后写入相应的日志内容,代码如下: static string _filePath = @" C:\Users\zhengchao\Desktop\测试文件.txt " ; static void Main( string [] args) { WriteLogAsync(); Console.ReadKey(); } static void WriteLogAsync() { var logRequestNum = 100000 ; // 请求写入日志次数 var successCount = 0 ; // 执行成功次数 var failCount = 0 ; // 执行失败次数 // 模拟100000次用户请求写入日志操作 Parallel.For( 0 , logRequestNum, i => { try { var now = DateTime.Now; var logContent = $ " 当前线程Id:{Thread.CurrentThread.ManagedThreadId},日志内容:暂时没有,日志级别:Warn,写入时间:{now.ToString(

C#黔驴技巧之去重(Distinct)

对着背影说爱祢 提交于 2020-08-12 20:42:54
前言 关于C#中默认的Distinct方法在什么情况下才能去重,这个就不用我再多讲,针对集合对象去重默认实现将不再满足,于是乎我们需要自定义实现来解决这个问题,接下来我们详细讲解几种常见去重方案,孰好孰歹自行判之。 分组 首先给出我们需要用到的对象,如下: public class Person { public string Name { get ; set ; } public int Age { get ; set ; } } 接下来我们添加100万条数据到集合中,如下: var list = new List<Person> (); for ( int i = 0 ; i < 1000000 ; i++ ) { list.Add( new Person() { Age = 18 , Name = " jeffcky " }); } 接下来我们对年龄和名称进行分组,然后取第一条即可达到去重,如下: list = list.GroupBy(d => new { d.Age, d.Name }) .Select(d => d.FirstOrDefault()) .ToList(); 扩展方法(HashSet去重) 我们知道在C#中HashSet对于重复元素会进行过滤筛选,所以我们写下如下扩展方法,遍历集合元素,最后利用HashSet进行过滤达到去重目的,如下: public