今天呢,在问答区看到一位易友在问如何优化,我就以他的代码为例来说一点关于优化的小技巧(骚操作)吧
拿过代码以后,先大体猜一下哪里耗时比较长,然后再设法优化 他的代码只用了核心库,核心库问题不大,那么如果有问题也大概率出在他的用法上
先来找有没有可以大幅度优化的地方
例如 频繁内存分配 ,大量计算 一般这就是导致效率低的罪魁祸首
首先是重定义数组,3次重定义都没有必要,不过这里应该对总耗时影响不大 pass 其次是分割文本,次数也不多,而且可根据后面的判断得出,只会分割成2、3份,应该也不会影响太大 pass
最后就是 取文本中间 了,他的 取文本中间 在两层循环中 而且根据上下文来看,这里就是识别的核心 取文本中间 单次耗时应该很少,但这里会调用 非常非常多次 所以我猜大部分耗时都在这里,来尝试优化一下
怎么优化呢 取文本中间 本身是个很简单的操作,优化空间不大,我们从侧面入手 取文本中间,会返回取到的文本,这里也就是按字符串的顺序一个字一个字返回 这里的问题不在于这个方法的耗时,而是在返回时的内存分配 前面说过了,内存分配对效率影响很大,这个方法每次都会返回一个新字符串 也就是每次都会申请内存,写入数据,然后返回,用过后还要销毁 这样次数少了还没事,但几万次几十万次,肯定会很慢的
来改一下 因为他是一个字一个字的对比 所以可以在循环开始前,将字符串写到字节数组 然后在循环中直接对比字节,就相当于是逐字对比了 这样就只会申请2次内存,后续都是读取操作
改完后跑一下看看速度
棒极了 分别调用两个测试10次 优化前 4156ms,优化后 297ms 效率提升了10多倍
PS:优化除了减少内存分配,还有对持久或常用数据做缓存,也就是可以把字库最终处理后的数据放到全局变量,只处理一次,这样还能快不少,各位自己试试吧
下载链接: https://t00y.com/file/20110282-443667210
|