如何提升你的云函数性能
发布于 4 年前 作者 schen 1079 次浏览 来自 分享

在使用云开发一段时间后,你一定会遇见一个问题:虽然云函数非常的方便,但我的云函数似乎性能不够好,为什么我的云函数每次加载都需 2 ~ 3 秒种,时间太长了!。 这篇文章,就来告诉你,应该如何提升你的云函数性能。

如何了解云函数运行情况?

在了解如何优化云函数的运行情况之前, 我们需要先了解,如何查看当前的云函数运行情况,这样才能有个对比。

  1. 打开小程序开发者工具,并打开你的项目
  2. 进入到你要调试的页面,打开调试器
  3. 调用云函数,并在调试器中切换到 Network 页面,找到你的请求。
  4. 点击你的请求,然后切换到 Timing 页面,查看具体的情况。

在这个页面中,你可以理解其中的 Waiting(TTFB) 是你发起请求到你接收到返回结果的第一个字节的时间,简单的来说,就是服务器计算结果需要花费的时间。而下方的 Content Download 则是下载内容所需的时间,你可以理解是表现出网络速度快慢的数据。

总结来说,就是__如果 Waiting TTFB 的值比较大,你就去优化云函数性能。如果 Content Download 的数值毕竟大,你就需要优化网络情况__

优化 Waiting TTFB

云函数的运行机制

Waiting TTFB 的优化是云函数性能端的优化,那么在优化之前,我们就需要先来了解一下云函数的运行机制,以便帮助我们了解应该如何去进行性能优化。

在蕴含运行时,具体的顺序是这样的

  1. 用户发起请求,请求发送到云开发的后台
  2. 云开发后台的调度器将请求分发给下方的执行的 worker 、容器
  3. 容器创建环境、下载代码
  4. 执行代码

在这个过程中,发起请求到云开发、调度器调度速度、调度器传递信息到容器、函数调用等,都是可以优化的,但是我们在具体的使用过程中。这些大都需要由云开发的工作人员来完成,对于我们自己来说,只能去尽可能的优化容器内部到代码层面的东西。

接下来,我们可以看看更细致的调用逻辑。

在云开发中,我们可以将调用分为三种类型:

  1. 冷启动:图中的红色阶段,需要重新创建容器、下载代码,耗时最长
  2. 温启动:图中的黄色阶段,需要下载代码,耗时较长
  3. 热启动:图中的蓝色阶段,不需要下载代码,耗时最短

我们可以看到,最快的,是热启动,函数不需要创建容器,不需要启动函数就可以完成执行,显然比要创建容器或要下载代码的温启动和冷启动速度更快。这样,我们就得到了优化云函数性能的第一个方法

1. 让你的云函数每次调用都走热启动

当我们可以让我们的云函数的每一次调用都走热启动,少了容器的创建和函数的部署,请求的速度理所当然的要比冷启动和温启动更快。

我们可以测试一下,我设置每秒调用一次云函数,看看 TTFB 的变化。

setInterval(()=>{wx.cloud.callFunction({name:'profile'})},1000)

函数内代码是默认创建的云函数代码。

则对应的执行效果如下

可以看到,函数的执行时间从第一次的 1.2s 降低到了 200ms左右,性能提升了 80%,我们仅仅是简单的提升了函数的调用频次,就可以实现提升函数的调用性能,这就是热启动带给我们的价值。

实施方案

如果你需要足够高的性能,不妨借助云开发的定时器,定期唤起你的容器,从而为你的容器保活,确保你的函数时刻被热启动。

2. 缩小你的函数大小

在前面我们曾介绍过,云函数在启动过程中,会创建容器和下载代码。创建容器的过程对于开发者来说不可控,不过我们可以使用一些方法,缩小我们的代码,提升代码的下载速度,比如说,缩小我们的函数代码

这里我们可以做个测试,这里我创建了两个函数,两个函数的代码完全一致,不同的是,在实验组的函数中,我加入了一个 temp 变量的声明,这个变量的值是一个非常长的字符串,从而使得两个函数的大小分别是 68K 和 4K。

接下来,我们看看二者的执行时间。

我们会发现,几乎没有差距的代码,因为加入了变量声明的因素,在性能上会略慢几毫秒,后续随着容器的不断复用,函数的之间的差距也越来越小,几乎可以忽视。

实施方案

对于你的代码,要尽可能的精炼,减少无用的代码,减少代码下载所需时间。

3. 削减不需要的 Package

除了下载代码以外,还需要下载 Node 环境运行所需的依赖包,虽然云开发可能针对 Node Modules 已经做了缓存,但依然存在下载的时间差区别,这里我也做了一个实验。

  • 空包:什么都没装,把 wx-server-sdk 都卸载掉了。
  • 复杂包:装了 Mongoose、sequelize、sails 等依赖的包。

函数逻辑上也相差无几,都是返回 Event ,则结果如下

我们发现,前三次可能是因为涉及到依赖包的下载问题,所以前三次的时长大小对比特别的明显,而从第四次开始,二者的区别就不大了,可能是因为依赖已经完成了缓存,所以可以直接使用缓存来完成函数的执行。

实施方案

你可以选择看看你的 package.json ,看看其中是否有你不需要的依赖,将其删除,仅保留有需要的依赖,可以有效提升你的代码执行速度。

优化 Content Download

如果你想要优化 Content Download ,核心需要优化的是两个点:

  1. 手机到服务端的节点的距离和速度
  2. 内容的大小

前者一般来说,你可以通过切换不同的网络环境来实现优化,比如从 3G 切换到 4G ,从 4G 升级到 5G,这些都可以提升你的手机到服务端节点之间的速度。

此外,还可以借助__内容分发网络 CDN 能力来完成缩小你到服务端节点之间的距离__,不过对于云函数来说,因为你不可控,无法控制,所以这一点不再谈。

这里补充一句,云开发的文件存储都是有 CDN 的,因此,你通过云存储下载的文件才会比别人更快。

后者则一般通过调整代码来完成,比如__只返回必须的资源,对于不需要的内容,不再返回,或压缩返回。__

总结

最后,我们回顾一下这篇文章中介绍的优化云函数的方法:

函数下载性能优化

  1. 保持函数容器的热启动,提升函数启动性能
  2. 缩小函数大小,提升代码下载速度
  3. 削减不必要的包,减少依赖大小

网络优化

  1. 使用更好的网络,比如 Wi-Fi
  2. 云函数中仅返回所需要的内容,减少下载时间。

以上这些方法,你都在你的函数中试过么?有没有其他的优化方法?欢迎你与我分享。

1 回复
回到顶部