Flutter添加compute函数

1.Flutter compute函数

compute函数是一个用于在后台Isolate中执行计算密集型任务的便捷方式。

Flutter中,UI操作都在主Isolate中执行,为了避免在主线程中执行耗时的计算或处理大量数据,可以使用compute函数将计算任务移交给后台Isolate执行,以保持应用程序的响应性。

  • compute函数的语法如下:

      Future<R> compute<Q, R>(R Function(Q message) function, Q message)
  • 其中:

    • function: 在后台Isolate中执行的计算密集型任务的函数。

    • message: 传递给function函数的参数。

2.compute基本用法

//
int sumResult(final int n) {
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += i;
}
return sum;
}


//调用
int res = await compute(sumResult, 100000);


3.compute使用闭包形式传递参数

int res = await compute((final int n) {
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += i;
}
return sum;
}, 100000);


4.compute并行计算

Future<int> parallelCompute() async {
final results = await Future.wait([
compute(sumResult, 30000),
compute(sumResult, 30000),
compute(sumResult, 30000),
compute(sumResult, 10000),
]);

int sum = 0;
for (var result in results) {
sum += result;
}

return sum;
}

5.完整示例代码

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';

class ComputeWidget extends StatefulWidget {
const ComputeWidget({super.key});

@override
ComputeWidgetState createState() => ComputeWidgetState();
}

class ComputeWidgetState extends State<ComputeWidget> {
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
ElevatedButton(

onPressed: () async {
DateTime startTime = DateTime.now();
int res = await compute(sumResult, 100000);
Duration timeDifference = DateTime.now().difference(startTime);
debugPrint('使用单个计算函数 1~100000 total:$res, timecost:$timeDifference');
},
child: const Text('compute函数:使用单个计算函数')),
const SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () async {
DateTime startTime = DateTime.now();
int res = await compute((final int n) {
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += i;
}
return sum;
}, 100000);
Duration timeDifference = DateTime.now().difference(startTime);

debugPrint('使用闭包形式传递参数 1~100000 total:$res timecost:$timeDifference');
},
child: const Text('compute函数:使用闭包形式传递参数')),
const SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () async {
DateTime startTime = DateTime.now();
int res = await parallelCompute();
Duration timeDifference = DateTime.now().difference(startTime);
debugPrint('使用compute进行并行计算 1~100000 total:$res timecost:$timeDifference');
},
child: const Text('compute函数:使用compute进行并行计算')),
],
);
}

Future<int> parallelCompute() async {
final results = await Future.wait([
compute(sumResult, 30000),
compute(sumResult, 30000),
compute(sumResult, 30000),
compute(sumResult, 10000),
]);

int sum = 0;
for (var result in results) {
sum += result;
}

return sum;
}
}

int sumResult(final int n) {
int sum = 0;
for (int i = 0; i < n; ++i) {
sum += i;
}
return sum;
}

6.效果


flutter: 使用单个计算函数 1~100000 total:4999950000, timecost:0:00:00.185042
flutter: 使用闭包形式传递参数 1~100000 total:4999950000 timecost:0:00:00.162817
flutter: 使用compute进行并行计算 1~100000 total:1399950000 timecost:0:00:00.526195
flutter: 使用单个计算函数 1~100000 total:4999950000, timecost:0:00:00.178511
flutter: 使用闭包形式传递参数 1~100000 total:4999950000 timecost:0:00:00.168732
flutter: 使用compute进行并行计算 1~100000 total:1399950000 timecost:0:00:00.546384

从以上可以看出,并行计算耗时较长;并非是比直接运行较快,可以思考下原因。

7.小结

  • compute适用场景

    • 适用于计算密集型任务,对于I/O密集型任务,使用 async 和 await 通常更合适。

  • compute和UI线程通信‘

    • 该函数在isolate中执行,因此不能直接访问UI线程中的变量或调用UI相关的函数。如果需要更新UI,必须使用 setState。

  • compute使用限制

    • 由于isolate的创建和销毁有一定的开销,对于非常短的计算任务,使用compute可能不是最佳选择。

    • 确保你的应用是支持 isolate 的(例如,不是在 Web 或 macOS 上运行)。


原文始发于微信公众号(ksnowlv):Flutter添加compute函数

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/256490.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之家——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!