先说一下此次要作什么, 咱们天天都须要同步一次本部门人员详细信息. 可是只有两个接口可用:node
在得到详细信息之后须要筛选出本部门的人员信息, 也就是org
字段中包含云部门
的数据, 筛选出的数据算是最新人员名单, 对比数据库中已有的数据, 作增量更新(也就是不存在的补上就够了).golang
我刚拿到这个任务简直无语, 真他妈无聊到批爆 ... fuck! 可是又隐约想起这彷佛是我之前遇到过的一个面试题, 简单想一想好像没什么嘛, 可是在30万的数量级, daily basis的状况下. 任何微小的浪费都会被放大, 这样一下就有意思了, 能作确定是能作, 可是怎么作会比较"快", 比较"经济"(不浪费内存), 针对这种状况, 如今市面上有这些流言, 他们说:面试
for _,item := range array
中间会有一次值拷贝, 而range array[index]没有
咱们会从时间+内存+CPU占用的状况分析某个策略的好坏, 时间的话好办, 那么内存+CPU数据应该怎么捕捉呢? 我知道有不少种方式, 目前比较常见的(网上教程比较多的)方法是经过pprof的方法来作. 我如今是经过最简单最naive的方式实现了个人需求, 在我定位出了我面临的问题之后, 我就能够一个一个去验证网上的这些"流言" (其实我想知道他们在说这些以前, 本身有没有真的实践过)数据库
在开始用pprof以前, 先介绍一下这个工具, 这个概念:json
大部分市面上的教程呢, 都是教教你怎么画火焰图, 调用图而后就结束了. 我以为pprof这个单词有点鬼畜, 我就从定义开始说, 单独搜了一下这个词是什么含义, 将它拆成两段: pprof = p + prof = Package Profiling. Packge就是你的程序, Prof就是Profile的简写, Profile是指一组栈追踪信息. 指, 当你但愿完成一个事件的时候, 全部的栈调用信息.数组
那么咱们就理解了, pprof是指咱们程序运行的时候, 来作栈分析, 进一步往下, 分析的内容能够是CPU, 也能够是内存分配分析等, 对应下来, 这个工具就提供了相应的指标供你观察, 咱们从最小, 但却最经常使用最简单的指标开始学习: ( 想学习最全面的指标, 能够点击这里 → 完整的指标 )函数
为了布置pprof, 你一共有两种方式, 两句话归纳这两种方式, 它们分别是:工具
runtime/pprof
:
net/http/pprof
: (咱们使用这种方式)
import _ "net/http/pprof"
func main() {
go func() {
http.ListenAndServe("localhost:6060", nil)
}
}
复制代码
在pprof观察点设置好了之后, 咱们让程序运行起来, 而后在**命令行中输入命令: go tool pprof http://localhost:6060/debug/pprof/profile
来得到CPU分析结果, 输入命令之后须要等待30秒钟等待采样完成. 随后就进入命令行模式, 咱们经过top5命令**查询CPU占用前五高的函数post
这样咱们就能得到, 在这30秒里, 在CPU上都发生了什么, 接下来, 咱们来详细分析一下这里面的一些指标都是什么含义:学习
一样的, 咱们使用这个命令来查看内存的使用状况: go tool pprof http://localhost:6060/debug/pprof/heap
跟上面的分析相似, 咱们能发如今咱们的程序中, 内存消耗大户是strings调用的函数, 以及json调用的函数. 若是你想知道更多, 咱们还能从网页版里面验证这些说法:
太好拉, 经过堆栈调用信息, 一下就他妈破案了, 咱们内存占用大户主要来自这两个函数的反复调用:
我不是说这两个函数有问题, 你们之后不要用了, 不是这样的, 只是说在个人程序中, 我反复调用了这两个函数, 不停的分配新内存. 如今真是太好了, 在"优化程序"这个巨大的话题中, 咱们至少已经定位出了咱们的问题, 围绕咱们的问题, 咱们不用像无头苍蝇同样了, 咱们能够针对问题想办法了 :)
总结一下我遇到的问题:
流言都是真的吗? 它们适用于个人状况吗? 又有多大程度的效果? 下次继续更新