离职前的工作经验总结
2016-07-29 15:26
225 查看
转眼间, 毕业到现在也8年了, 一直以来都很懒, 没有留下什么技术方面的总结或者分享什么的。因为最近要换工作, 觉得很有必要总结一下,方便自己和他人。
由于我一直待在一家专业领域(非互联网)的软件公司,接触的知识面相对比较有限, 主要集中在算法, 性能优化, 内存管理, 多线程等, 几乎没有接触过现在比较流行的开源框架, 所有的一切也没有开源的东西可以参考, 大概是相关的领域比较狭窄的缘故, 全球也就3家公司在做这个领域, 每一家都宝贝似的把代码捂得紧紧的, 谁有舍得拿来开源那?下面就针对这几个方面, 记录下自己的一些心得:
1、算法/数据结构
在数据库领域, 不管是关系型的, 还是NoSql, 还是各种其自定义的, 都需要 B-树, B+-树, AVL树等理解的比较清楚, 另外的LRU的实现,动态规划算法也要清楚, 其他排序啦、链表啦更加基础, 不用多说啦;
2、内存管理
在一些性能要求比较高的领域, 都会实现自己的内存池来优化和管理内存的使用, 我们也有一套这样的内存管理,他会把内存的使用分为固定大小和变长内存, 我们都知道内存直接从系统来分配和释放效率是不高的, 为了提高性能, 基本的思路就是从内存一次分配一块比较大的内存, 然后把它分成等长的内存块, 需要的时候从未分配的内存块链表内得到, 释放的时候, 将暂时不用的内存块用一个链表串起来。
另外, 使用自己的内存管理, 可以非常方便的统计内存的使用, 以及问题的排查;
3、 多线程
在我们的程序, 使用pthread 来实现多线程, 当然若是C++, 也可以用C++自带的线程管理函数, 具体的实现不难, 就不多说,给一些建议: (1)尽可能把并行的部分的逻辑简化; (2)尽可能少加锁, 锁对性能的消耗还是很严重的, 尽量考虑用 lock
free编程方式;
定位bottleneck:常用的工具IBM rational quantify, callgrind, Oracle 的collect, 我只用过这几个, 应该还有其他的, 而且我一直用C/C++开发, 其他语言的测试性能工具没有研究过;
优化代码: 这是工作量最小, 也是最容易达到目标的方式, 在数据库里面2-8理论尤其成立, 在关键的地方, 有时候一个优化, 效果是非常明显的。 尤其是你负责的代码还没有经历过非常多次的性能优化;
架构调整:如果代码优化没有提高的空间, 就要考虑架构的调整, 这里涉及的就比较广了, 例如, 添加缓存, 添加索引, 修改算法, Load on demand(类似copy on write )等, 其实也没有什么固定的模式, 根据问题的特征, 找到相应的解决方式, 这里比较推荐多参考一些优秀的开源项目, 例如LINUX内核, 看看人家高手遇到这样的问题是如何解决的。
并行化: 对于很多传统的项目, 最开始的实现是串行的, 随着业务逻辑的发展, 发现单线程无论怎么优化都无法满足要求的时候, 就开始考虑多线程, 这里的建议是: (1)如果有其他办法, 不要考虑把你的系统改为多线程, 尤其是你用的开发语言是C/C++这样的对并行没有支持的; (2)将并行化的部分集中在一个小的performance sensitive的部分;
由于我一直待在一家专业领域(非互联网)的软件公司,接触的知识面相对比较有限, 主要集中在算法, 性能优化, 内存管理, 多线程等, 几乎没有接触过现在比较流行的开源框架, 所有的一切也没有开源的东西可以参考, 大概是相关的领域比较狭窄的缘故, 全球也就3家公司在做这个领域, 每一家都宝贝似的把代码捂得紧紧的, 谁有舍得拿来开源那?下面就针对这几个方面, 记录下自己的一些心得:
1、算法/数据结构
在数据库领域, 不管是关系型的, 还是NoSql, 还是各种其自定义的, 都需要 B-树, B+-树, AVL树等理解的比较清楚, 另外的LRU的实现,动态规划算法也要清楚, 其他排序啦、链表啦更加基础, 不用多说啦;
2、内存管理
在一些性能要求比较高的领域, 都会实现自己的内存池来优化和管理内存的使用, 我们也有一套这样的内存管理,他会把内存的使用分为固定大小和变长内存, 我们都知道内存直接从系统来分配和释放效率是不高的, 为了提高性能, 基本的思路就是从内存一次分配一块比较大的内存, 然后把它分成等长的内存块, 需要的时候从未分配的内存块链表内得到, 释放的时候, 将暂时不用的内存块用一个链表串起来。
另外, 使用自己的内存管理, 可以非常方便的统计内存的使用, 以及问题的排查;
3、 多线程
在我们的程序, 使用pthread 来实现多线程, 当然若是C++, 也可以用C++自带的线程管理函数, 具体的实现不难, 就不多说,给一些建议: (1)尽可能把并行的部分的逻辑简化; (2)尽可能少加锁, 锁对性能的消耗还是很严重的, 尽量考虑用 lock
free编程方式;
4、 性能优化
因为我自己一直负责一个数据库的缘故, 并且这个数据库是对性能要就非常高的, 需要几乎实时的响应前台的写入和查询要求, 所以随着工作年限的增长, 越来越多的时间都放在了性能优化上面。 通常, 我们可以通过如下的方式来优化我们的程序:定位bottleneck:常用的工具IBM rational quantify, callgrind, Oracle 的collect, 我只用过这几个, 应该还有其他的, 而且我一直用C/C++开发, 其他语言的测试性能工具没有研究过;
优化代码: 这是工作量最小, 也是最容易达到目标的方式, 在数据库里面2-8理论尤其成立, 在关键的地方, 有时候一个优化, 效果是非常明显的。 尤其是你负责的代码还没有经历过非常多次的性能优化;
架构调整:如果代码优化没有提高的空间, 就要考虑架构的调整, 这里涉及的就比较广了, 例如, 添加缓存, 添加索引, 修改算法, Load on demand(类似copy on write )等, 其实也没有什么固定的模式, 根据问题的特征, 找到相应的解决方式, 这里比较推荐多参考一些优秀的开源项目, 例如LINUX内核, 看看人家高手遇到这样的问题是如何解决的。
并行化: 对于很多传统的项目, 最开始的实现是串行的, 随着业务逻辑的发展, 发现单线程无论怎么优化都无法满足要求的时候, 就开始考虑多线程, 这里的建议是: (1)如果有其他办法, 不要考虑把你的系统改为多线程, 尤其是你用的开发语言是C/C++这样的对并行没有支持的; (2)将并行化的部分集中在一个小的performance sensitive的部分;
相关文章推荐
- UIScrollView、UIPageControl、NSTimer知识点回顾
- 萬能處理JSON數據工具類
- Unable to install "XXX"
- [Module]matplotlib模块安装
- Activiti 工作流 5.19.0 教程(2)
- Cornerstone详细操作
- 2016 Multi-University Training Contest 4 Another Meaning
- linux c timer
- offsetLeft,offsetTop,offsetHeight,offsetWidth,scrollTop,scrollLeft,scrollHeight,scrollWidth
- sort算法函数排序示例
- 概念,包括对象,接口,类,方法
- 隋唐英雄第70集和第90集的片头真有意思
- [转载] ffmpeg 基本数据结构和对象: AVPacket、AVPicture、AVFrame
- iOS里常见的几种信息加密步骤简单总结
- jsp技术:day2--jsp的几个容器、myAjax(隐藏帧技术)底层原理、jsp的三代开发技术
- 在HTML中使用JavaScript
- tyvj P1015 公路乘车
- POJ 2823 Sliding Window
- Softmax算法:逻辑回归的扩展
- 指针数组和数组指针的区别&指针函数和函数指针的区别