流程

  1. 确定指标:明确要优化哪些指标,指标如何定义和计算。
  2. 测试工具:定位问题使用到的工具,第三方工具,或者自行开发。
  3. 定位问题:使用工具定位问题,例如页面滚动卡顿,要定位到具体哪些代码逻辑耗时较多。
  4. 需求文档:编写技术需求文档。
  5. 任务分配、版本排期:如果是多个人负责,需要根据实际情况分配任务,并进行版本排期。
  6. 技术优化:具体进行优化。
  7. 成果验收:优化完成后,使用测试工具再次测试,对比分析优化前后的效果。
  8. 规范制定:如果优化过程中,发现了一些业务代码的写法容易导致性能问题(例如在BindView过程中打Log而且线上包没有删掉,容易引起卡顿),可以针对性的制定一些代码规范。还可以封装基础工具类解决这类问题(封装Log工具类,统一控制Log输出),借助静态代码检查工具进行约束(例如可参考 美团外卖Android Lint代码检查实践 )。
  9. 持续监测:借助监控SDK、CI工具等,持续监控性能指标,避免之后性能持续下降。
阅读全文 »

背景

在Android应用中,ListView / RecyclerView / ScrollView 滚动时,如果有过多图片加载容易导致卡顿,特别是快速滚动时,bindView中大量图片加载操作,会导致系统频繁分配回收内存,不仅消耗大量CPU和网络流量资源,而且极端情况下还会因为内存来不及回收产生OOM。

阅读全文 »

Crash率是Android App中的重要指标,对用户体验的影响非常大,因此监控一个App的Crash率是一个很重要的事情。第三方有现成的Crash监控方案,但是不一定能满足所有项目的需要,本文讨论Android监控SDK的完整设计思路,包括数据采集,存储,上报,展示,报警,去重等一系列流程。

Crash率的计算

阅读全文 »

备注:文章写的比较早,一直没发出来,里面有些内容可能和小程序最新的情况有一点点差异……

最近接触小程序开发,遇到了大量的坑,做个总结分(tu)享(cao)一下。

阅读全文 »

Nginx是一款轻量级的Web服务器、反向代理服务器。

正向代理与反向代理

阅读全文 »

Supervisor是一款用Python实现的进程管理工具,可用于在后台以Daemon模式运行进程,并能在异常时自动重启。例如可以用Supervisor管理Node、Nginx等。

安装

阅读全文 »

Node.js项目常用PM2部署,遇到了一个问题。

首先介绍一下PM2启动script的方法。

阅读全文 »

需求:

  • 检查服务状态
  • 如果服务未启动,则启动服务
阅读全文 »

本文用到的Shell命令:

  • grep
  • find
  • wc
  • xargs
  • sort
阅读全文 »

遇到一个问题,转移网站图片,需要在Linux远程计算机之间复制大量文件(文件数量多,占用总空间也大),有多种方案。

1、下载到本地再上传到目标服务器。两个服务器都在国外,并且带宽很大,直接传输速度很快。但下载到本地的做法,大大受限于本机的网速,效率实在太低。

阅读全文 »

Top K问题,即找到第K大(小)、最大(小)的K个元素一类问题。

第K个最大元素

阅读全文 »

题目

127. 单词接龙

阅读全文 »

题目

605. 种花问题

阅读全文 »

基本思路

使用分治思想。选择一个Pivot,把小于Pivot的放到Pivot左边,大于Pivot的放到Pivot右边。之后继续对Pivot分隔开的左右两侧做相同的操作,直到所有元素有序。

阅读全文 »

Java引用类型

Java中有四种引用类型。其中SoftReference、WeakReference、PhantomReference构造时都可以指定ReferenceQueue,当目标对象 (Referent) 被回收时,Reference会被添加到队列中。

阅读全文 »

常用集合与分类

  • Collection

    • List:按顺序保存元素。
      • ArrayList:数组实现,随机访问性能好。
      • LinkedList:双向链表实现,插入删除性能好。
    • Set:不添加重复元素。
      • HashSet:快速查找元素,由HashMap实现。元素须定义 hashCode()equals() 方法。
      • LinkedHashSet:快速查找元素+链表维护读写顺序,由LinkedHashMap实现。元素须定义 hashCode()equals() 方法。
      • TreeSet:有序Set,由TreeMap实现。元素须实现 Comparable 接口。
    • Queue:队列,先进先出。
      • Deque:双端队列 (double-ended queue)。
        • ArrayDeque:数组实现,头尾指针在数组中循环移动,性能好。
        • LinkedList:双向链表实现。
      • PriorityQueue:插入后排序元素,使用堆实现,队列头部默认为最小的元素(自然顺序)。
  • Map

    • HashMap:散列表实现,根据Key存取关联的Value。
    • LinkedHashMap:HashMap+双向链表维护读写顺序。默认是维护最后写入的顺序,也可以指定为读取排序 (accessOrder),使用LRU算法实现。
    • TreeMap:根据key进行排序,使用红黑树实现。插入时找到key对应的节点并替换value,没找到则生成新节点。
阅读全文 »

Thread

状态

阅读全文 »

SparseArray是Android提供的数据结构,在某些场景下可以替代HashMap实现更好的性能。SparseArray在Android Java Framework源码中有大量使用。

SparseArray系列主要有:

阅读全文 »

背景

需要对APP的运行速度进行性能优化,在可能有性能问题的地方手工埋点的做法非常繁琐、效率低下,希望能有一个可以直观易用、自动化、精细化的分析代码耗时的工具。

阅读全文 »

背景

在Android开发中,经常需要在不同的组件之间通信。函数调用就可以看成是一种通信,调用者和被调用的函数是消息的发送方和接收方,参数和返回值是消息内容。除了直接调用以外,比较常见的就是总线形式的通信。

阅读全文 »