协程在处理高并发和I/O密集型任务时,具有明显的优势,尤其是在编写异步代码时更加简洁和高效。然而,对于CPU密集型任务和传统的多任务处理,线程仍然是一个成熟且有效的选择。
选择协程还是线程,取决于具体的应用场景和需求。随着Kotlin协程在Java生态系统中的普及,越来越多的中间件和框架开始支持协程。
但是并不一定要使用协程,使用基于多线程的分布式并发框架也可以实现类似的效果、如akka、Spring WebFlux等。
public final class TimeUtil {
private static volatile long currentTimeMillis;
static {
currentTimeMillis = System.currentTimeMillis();
Thread daemon = new Thread(new Runnable() {
public void run() {
while (true) {
currentTimeMillis = System.currentTimeMillis();
try {
TimeUnit.MILLISECONDS.sleep(1);
} catch (Throwable e) {
}
}
}
});
daemon.setDaemon(true);
daemon.setName("sentinel-time-tick-thread");
daemon.start();
}
public static long currentTimeMillis() {
return currentTimeMillis;
}
}
json转换的性能问题
List<VendorAllVo> vendorList = vendorInfoMapper.findVendorList();
log.info("日志输出:{}", JSONUtils.toJSONString(vendorList));
if(log.isInfoEnabled()){
log.info("日志输出:{}", JSONUtils.toJSONString(vendorList));
}
class User { private long id; private String name; private String email;} public User getUserInfoLowPerformance(long userId) { String key = USER_INFO_KEY + ":" + userId; String jsonUser = (String) redisTemplate.opsForValue().get(key); if (jsonUser == null) { return null; } return new Gson().fromJson(jsonUser, User.class); } public User getUserInfo(long userId) { Map<String, Object> userInfoMap = redisTemplate.opsForHash().entries(key); if (userInfoMap.isEmpty()) { return null; } user = new User(); user.setId((Long) userInfoMap.get("id")); user.setName((String) userInfoMap.get("name")); user.setEmail((String) userInfoMap.get("email")); //... }
JVM内存模型,不同的jdk版本;确保内存可见性和指令重排序的规则、以及线程的调度
JVM gc参数设置、包括gc频率、相关参数线程数
用户态和内核态切换。
选择不同的锁,会对并发产生比较大的影响;
锁分类 :互斥锁、自旋锁、读写锁、乐观锁、悲观锁、锁分段(表锁、行锁、间隙锁)、无锁cas
数据库、缓存、断路器(限流、降级、合并)、服务间调用、配置中心、链路追踪、日志、JMQ
基数和标准:一次Tcp连接时间、一次Http连接时间
如机器配置4核8g mysql, qps和tps 响应时间根据sql复杂度从几十ms~ns不等
如机器配置8核32C redis qps 响应时间从nms~100ms
堆外内存
减少gc、序列化和反序列化。
字节码增加
Ask gpt4.0 字节码增强如何提高代码性能
缓存行
64Kb、Disruptor、伪共享
https://tech.meituan.com/2016/11/18/disruptor.html
类似概念磁盘顺序读写
局部性原理和分支优化
空间局部性优化:使用数组、合理模型结构
较少分支、分支展开、条件合并