1.首先我们通过一张图来认识服务端与客户端的联系与区别
2.计算机区别于传统的优势(计算速度快 && 存储容量大)
2.1 CPU
计算机中,CPU充当了很重要的角色,那么在程序中我们也应该为CPU减压,应注意下面的几项:
>杜绝死锁(低级错误)
>避免长时间独占(多CPU,Sleep,程序调度规划)
>避免浪费(使用优秀的算法,减少计算量,O(n),O(n^m))
例如: 找出下面一组数列中最大的连续子序列
-1,2,9,5,-5,10,1,2
2.2 内存
在计算机中,内存属于稀缺资源,具备读取速度快的优点,所以应当避免出现:内存泄露!
>确保资源及时释放,确保如果发生异常的情况下,也能及时释放
>内存使用策略:牺牲空间换时间
>预加载
>缓存机制
>全局变量
2.3 硬盘
>I/O速度永远不够快
>硬盘:容量大,速度慢
>内存:速度快,容量小
>效率
>协调内存和硬盘,CPU才能有最高的效率
>瓶颈在与读取和保存
>一次读,多次用
>多次更新,一次写入
>使用频繁的小数据常驻内存
>I/O异常处理(注意资源释放)
3.数据库
>数据库连接及时释放
>控制访问频率和单次数据量
>如客户端同步,每次TOP200
>冗余字段提高查询效率
>牺牲空间换时间
>如:Houses.PKDistrict, Houses.PKBlock
>避免浪费(使用优秀的算法,减少计算量,O(n),O(n^m))
>减少连接次数
>控制单次交互的数据量和复杂度
4.Web Service
最不稳定最重的资源
不要假设Web Service跟本地方法一样可靠
永远要考虑Web Service的可能错误
>Web Service不能访问
>Web Service异常
>Web Service慢(本地 网络和服务器都会导致)
>交互格式不对(调错了?升级了?)
永远考虑怎么减少Web Service的交互次数
协调Web Service,合理规划频率和颗粒度
问题:如何快速的同步10万条数据?
分析:
数据量可能很大
客户端网络可能不稳定,随时断掉
服务器压力不能太大
方案:
颗粒度:每次获取200条数据(TOP 200,100K以下)
保证数据量的前提下,不会给网络传输和服务器数据处理带来太大的压力
断点续传机制:记录成功执行的位置,便于下次同步
5.牺牲空间换时间(效率)
数据库表冗余常用搜索字段
统计性不经常变的数据
>定期由一个计算实例去更新
>其他只负责读取(读写分离)
低效率的like关键字查询
>增加索引机制
>把like查询转换成“=”、“in”或“join”
6.考虑系统性能而不只是局部
要考虑局部效率
同时要考虑满足局部效率后的代价,是否过多消耗了别的模块的资源
比如过度调用Web Service
考虑分布式计算,选择合适的计算节点,尽量让客户端参与更多的运算,而不是依赖云端;如:云采集,打印招贴等
7.平衡频率和效率
处理的任务有大小
大任务意味着大的计算量(CPU),大的数据量(内存、网络带宽、硬盘灯)
耗时耗资源的任务需要适当分解到一定的颗粒度去解决
寻求:开销最小,速度最快,稳定性强壮型更好
比如:移动端调用的Service,单次交互的JSON数据量如果>1M以上,基本算不合理;如果1秒调用了10次以上Service,也是不合理的;