- StopWatch计算代码耗时
- 如何解决MySQL主从延时
- BeanUtils.copyProperties
StopWatch计算代码耗时
来自:org.springframework.util.StopWatch;
public static void main(String[] args) throws InterruptedException {
StopWatch stopWatch = new StopWatch();
stopWatch.start("a");
Thread.sleep(1000); // 在这里写需要测试耗时的代码
stopWatch.stop();
stopWatch.start("b");
Thread.sleep(2000);
stopWatch.stop();
stopWatch.start("c");
Thread.sleep(3000);
stopWatch.stop();
System.out.println(stopWatch.getTotalTimeMillis()); // 输出任务总耗时
System.out.println();
System.out.println(stopWatch.getLastTaskTimeMillis()); // 输出最后一个任务的耗时
System.out.println();
System.out.println(stopWatch.prettyPrint()); // 以表格形式打印结果 单位ns
}
任务结果:
如何解决MySQL主从延时
前置知识
-
什么是主从延时:主从库在同一时间出现数据不一致。(个人理解)
-
主从复制原理:
流程:写入binlog(耗时t1),传递binlog并且 从库同步到relaylog(耗时t2),
SQL thread 执行relaylog(耗时t3)。
其中影响最大的是t3。
解决方法
-
提高物理机性能(特别是从库所在机)
-
避免大事务(分批执行,减少t3)
-
优化带宽(减少t1和t2)
-
使用Redis做一层缓存(解决主从延时就是解决主从数据库数据不一致问题)
-
直接查询主库(核心业务场景可以使用)
-
升级MySQL版本(高版本支持多线程复制)
BeanUtils.copyProperties 不推荐使用
理由:
-
同一类型属性不同时会拷贝失败,但不会报错(若一个是基本类型,一个是对应包装类,会报错)
-
已赋值属性会被覆盖
exp: A 类 和 B 类 都有 名字和年龄。 A 初始化 name = null , age = 18; B 初始化 name = "小强", age = null; BeanUtils.copyProperties(A,B); B 的名字会改为null
-
属性拷贝由方法内部实现,难以溯源
-
内部类是无法成功拷贝
-
该拷贝是浅拷贝
-
底层是反射机制,效率低下。
可以用联合上面的stopwatch来进行测试:
public static void main(String[] args) throws InterruptedException { StopWatch stopWatch = new StopWatch(); A a = new A(); a.setName("小强"); B b = new B(); stopWatch.start("工具拷贝"); for (int i = 0; i < 10000; i++) { BeanUtils.copyProperties(a,b); } stopWatch.stop(); stopWatch.start("方法拷贝"); for (int i = 0; i < 10000; i++) { b.setName(a.getName()); } stopWatch.stop(); System.out.println(stopWatch.prettyPrint()); // 以表格形式打印结果 }
测试结果:
可以发现各测试10000组,绝大多数时间均由BeanUtils.copyProperties使用。效率低下。
标签:耗时,每日,System,StopWatch,一记,stopWatch,println,out From: https://www.cnblogs.com/strind/p/17933278.html