Flutter 性能优化之Native 系列(二): Flutter 与 Go 图片压缩性能测试

前言

上一篇文章 介绍 Flutter 与 Go 互相调用的基础,并提出用 Flutter 实现跨平台的UI和交互,用 Go 替代 C\C++ 来访问底层设备或做 CPU 密集计算。

针对这一想法,对 Go 做底层计算做性能测试,以展示 Go 语言优秀的生态和底层计算能力。

目标

图片压缩是客户端开发中经常需要用的功能,并且也是非常消耗资源的操作。由于通常压缩图片只是一两张,所以对资源消耗关注的不多。但如果在业务中,有同时大量的图片做压缩操作时,那不得不面对性能优化的问题。

图片压缩在 Flutter 端有很多dart的实现,或者借助 flutter channel 与原生系统通信,并借用原生系统的实现。

本文展示的是 Go 实现的图片压缩与 dart 原生实现图片压缩消耗时间的对比。

图像压缩实现

Go 实现图片压缩

基于 Go 优秀的生态,图片压缩功能有很多第三方库实现,这里用的是 resize

代码比较简单,就是调用第三方的库,传入输入输出路径即可。

golang 复制代码
//export CompressImage  
func CompressImage(inputPath string, outputPath string, width, height uint) *C.char {  
    out := toCString(outputPath)  
    inputFile, _ := os.Open(inputPath)  
    defer inputFile.Close()  
    img, _, _ := image.Decode(inputFile)  
    resizedImg := resize.Resize(width, height, img, resize.Bicubic)  
    outputFile, _ := os.Create(outputPath)  
    defer outputFile.Close()  
    jpeg.Encode(outputFile, resizedImg, nil)  
    return out  
}

按照上一篇文章的步骤,执行编译命令

shell 复制代码
go build -buildmode=c-shared -o libcompress_image.so

并复制 .so 文件和 .h 文件到指定目录,配置ffigen并生成dart对应的的 ffi 代码。

Flutter 原生实现

Flutter 端借用的是 flutter_luban 插件,它的使用方法更简单

dart 复制代码
Future<void> initPathByLuban() async {
  String path = (await getApplicationDocumentsDirectory()).path;
  var srcPath = "$path/1.jpeg";
  var destPath = await Luban.compressImage(CompressObject(imageFile: File(srcPath), path: path));
}

引入插件后,只需要调用 Luban.compressImage 即可。

测试

针对两种不同的实现,执行命令

shell 复制代码
 flutter run --release

基于 Golang 实现的动态库,实现图片压缩时

基于 flutter_luban 插件,实现图片压缩时

可见,同样14M左右的图片,压缩到150K左右时,基于 FFI 通道实现对比原生语言实现,耗时由4700毫秒减少至1300毫秒,至少减少耗时3秒左右。

虽然本文只测试了一个图片,并且只测试了一个平台的,测试的结果不够严谨。但几倍的耗时差距也可以看出,借用 Go 语言实现密集计算,是个很不错的选择。

并且由于 Go 支持多平台的交叉编译,我们用go实现的库,可以方便的扩展的 macOS、windows的平台,这也是 flutter channel 所不能比拟的。

相关推荐
梦想的颜色6 分钟前
前端UI宝藏SKILL——UI/UX Pro Max
前端·ui·ux
無名路人23 分钟前
uniApp 小程序 vue3 app.vue静默登录其他页面等待登录完成方式二
前端·微信小程序·ai编程
CoCo的编程之路27 分钟前
2026 前端效能飞跃:深度解析智能助手的页面构建最大化方案
前端·人工智能·ai编程·智能编程助手·文心快码baiducomate
JavaAgent架构师1 小时前
前端AI工程化(一):AI通信协议深度解析
前端·人工智能
林恒smileZAZ1 小时前
前端如何让图片、视频、pdf等文件在浏览器直接下载而非预览
前端·pdf
孙6903421 小时前
electron播放本地任意格式的视频
前端·javascript
小小小小宇1 小时前
设计稿转代码:如何将生成代码与内部组件库关联
前端
七牛云行业应用1 小时前
别每个 AI 工具单独配了!MCP 一次搭建,Claude、Cursor、TRAE 全能用
前端
_xaboy1 小时前
FormCreate 设计器 v6.3 正式发布:AI 表单助理3.0登场!
前端·vue.js·低代码·开源·表单设计器
胡志辉1 小时前
邮件中点击“加载图片”,你的IP地址已经被泄漏
前端·后端·安全