在 2016 QCon 大会上,技术大牛 Martin Thompson(伦敦金融衍生品交易所LMAX的创始人兼CTO)进行了技术分享,主题是“影响性能的前10大错误”,内容较多,下面只介绍下 top 1,2
有兴趣的可以看下原文,地址
http://www.infoq.com/articles/top-10-performance-mistakes
1. Logging
Thompson认为logging是最容易影响性能的,他给了一个图表,描述了logging线程的增加与时间耗费的关系
从图中可以看出,随着用于logging的线程增加,消耗的时间随之线性增长
Thompson说测试了绝大多数的日志系统,画出来的图都是这样的,Loggers是系统性能的重要瓶颈,建议使用异步logger
有很多错误日志信息是重复的,Thompson建议只在第一次发生时记录日志,以后重复出现时,增加计时器即可
2. API Design
Thompson 认为在性能方面,很多API接口的设计都很糟糕
例如这个接口
public String[] split(String regex)
这个设计有什么问题呢?
首先,返回类型是一个固定长度的数组,那么在方法实现中就需要使用一个临时结构体,用于copy数据到数组
另外,调用者调用此接口后,得到一个数组,如果想要对结果做一些操作,如排序,他就不得不把数组中的数据copy到另一个结构体中
有什么更好的设计方法呢?
只需要简单的修改一下返回值的类型,不使用固定数组,而是返回一个迭代器,就可以避免第1个问题,如
public Iterable split(String regex)
如果想进一步提高性能,可以取消返回值,增加一个参数,让调用者自己提供存放结果数据的结构体,如
public void split (String regex, Collection<String> dst)
这样,如果调用者想去掉重复的数据,就可以使用SET,如果想要一个有序列表,就可以使用TreeMap