存在性能问题的地方

来源:互联网 发布:八度网络面试 编辑:程序博客网 时间:2024/05/14 16:43

一些性能、效率、错误等等一系列问题的根源都是因为数据结构或者算法逻辑设计的不合理导致的。这里面算法和数据结构里面有很多基础的规范,这里不做叙述,后面我会一一分析。当你意识到它的时候,它才会有机会发挥无与伦比的威力,让你的代码无懈可击。


设计一个程序,理清楚整个数据结构和算法的逻辑,记录下来,这是一些复杂业务系统功能的核心。

影响算法设计的前提有很多个,有一些步骤是无论如何都绕不过去的,提前考虑,能少走弯路。比如说一些需求、框架选择、操作系统选择、数据库选择等等。后期如果变动多了,算法不合适的话,记住一定要重构代码,不然实现功能之路可能会越走越窄,时间越长越是难以回头。总之一句话,让你的代码永远年轻下去,不要让它变的越来越烂。


下面总结一些性能效率方面的主要问题:

1、算法在设计上存在重复计算的问题。比如在做循环遍历的时候,切记考虑清楚,尽最大限度减少遍历操作。

2、凡是能交给数据库取做的操作尽量交给数据库取做(SQL处理也有相对应的性能优化问题,后面开篇另说)。数据库是C/C++编写,运算速度按理说最快。数据库比程序更耗时的操作一般都在打开、关闭数据库连接的操作上,即便有连接池缓冲存在。一些特殊的SQL函数如果用错了地方,也会导致效率低下。

总结一些框架,大致是这样,细节上有出入,后面我再总结,问题的关键还是整体算法,可以通过做时间复杂度计算来判断效率的高低。

(1)单个取值速度从快到慢:数据库查询-->map取值-->在程序中做循环遍历取值。

(2)循环取值速度从快到慢:数组-->List链表-->map

(3)SQL语句在做查询的时候,一定要注意,写查询的时候需要考虑交叉集合计算问题,join比子查询快,切记不要用嵌套循环。

(4)数据结构的优化问题:使用java标准库提供的容器。优先选择ArrayList来处理顺序结构,选择HashSet来处理集合,选择HashMap来处理关联数组。选择linkedList来处理堆栈和队列,linkedList对顺序访问进行了优化,向List中间插入与删除的开销小,但随机访问则较慢。当使用前三个的时候,通常将他们向上转型为List、Set和Map,这样就可以在必要的时候以其它方式实现。

3、字符串的不可变性,这个不再做叙述,记得String、StringBuffer、StringBuilder的区别,其中StringBuffer是线程安全的,StringBuilder不是线程安全的。

4、公共变量和私有变量,尽可能小的缩小对象的作用域。

5、批量处理与单个处理的区别。设计时要想清楚,有些计算是可以做批处理的。如果将一个算法弄成批处理,很多读取步骤可以省略,很多写入步骤可以一并写入,这是个提高处理吞吐率、大量数据快速处理的捷径!节省下来的时间是比较惊人的,当然很多时候,这样处理可能让代码变的更多,很多逻辑需要统筹考虑,逻辑不一定会变的更复杂,但是梳理逻辑是必不可少的。我们还经常碰到,想让批处理、单个处理能共用一套算法逻辑的情况,这里面,能共用的尽量共用,不要写两遍相同功能但不同代码结构的逻辑。


未完结,待续。

0 0
原创粉丝点击