我读到了飞镖并发性的故事。CMIIW,我们应该使用isolate来避免阻止UI呈现。但是,我发现isolate.spawn要慢得多。
那我们为什么要孤立?仅仅使用主管道不是比等待更长时间更好吗?
import 'dart:convert';
import 'dart:isolate';
void main() async {
final jsonStr = '{'
'"name": "alif",'
'"age": 26,'
'"gender": "male",'
'"office": "work from home"'
'}';
Future asyncRun<Q>(Function(Q) function, Q message) async {
function(message);
}
final stopwatchA = Stopwatch()..start();
for (var i = 0; i < 100; i++) {
jsonDecode(jsonStr);
}
print('100 sync run : ${stopwatchA.elapsed}');
final stopwatchB = Stopwatch()..start();
await Future.wait(
[for (var i = 0; i < 100; i++) asyncRun(jsonDecode, jsonStr)],
);
print('100 async run : ${stopwatchA.elapsed}');
final stopwatchC = Stopwatch()..start();
await Future.wait(
[for (var i = 0; i < 100; i++) Isolate.spawn(jsonDecode, jsonStr)],
);
print('100 isolate.spawn: ${stopwatchC.elapsed}');
}





在我从jamesdlin上读到关于产卵时间的评论之后。
我更新密码。我扩展了json,只使用了一个隔离器。我发现隔离器跑得更快了。但我不明白为什么会发生这种事?我预计在最好的情况下,情况会略有恶化或类似的情况。
import 'dart:convert';
import 'dart:isolate';
void main() async {
final N = 1000;
String content = '';
for (var i = 0; i < N; i++) {
content += '"content$i": $i';
if (i != N - 1) content += ',';
}
final jsonStr = '{$content}';
Future asyncRun<Q>(Function(Q) function, Q message) async {
function(message);
}
final stopwatchA = Stopwatch()..start();
jsonDecode(jsonStr);
print('$N content sync run : ${stopwatchA.elapsed}');
final stopwatchB = Stopwatch()..start();
await asyncRun(jsonDecode, jsonStr);
print('$N content async run : ${stopwatchA.elapsed}');
final stopwatchC = Stopwatch()..start();
await Isolate.spawn(jsonDecode, jsonStr);
print('$N content isolate run : ${stopwatchC.elapsed}');
}


发布于 2022-08-31 02:23:21
当做一些占用大量cpu时间的事情时,如果它在主隔离点上运行,UI将被阻塞。isolate.spawn是最好的方法。
发布于 2022-08-31 05:10:42
使用隔离,您的Dart代码可以一次执行多个独立的任务,如果可用,可以使用额外的处理器核心。隔离与线程或进程类似,但每个隔离器都有自己的内存和运行事件循环的单个线程。
主要分离物
你通常根本不需要考虑隔离。典型的Dart应用程序执行应用程序的主要隔离程序中的所有代码,即使是单个隔离程序也可以通过使用异步等待等待异步操作完成才能顺利执行,然后再继续执行下一行代码。一个性能良好的应用程序会很快启动,并尽快进入事件循环。然后,应用程序会根据需要使用异步操作来响应每个排队的事件。
隔离生命周期如下图所示,每个隔离器都从运行一些Dart代码开始,例如main()函数。这个Dart代码可能注册一些事件侦听器--例如,响应用户输入或文件I/O。当隔离器的初始函数返回时,如果它需要处理事件,则该隔离器将保持在周围。在处理事件之后,隔离器就会退出。
在客户端应用程序中,事件处理,主隔离程序的事件队列可能包含重绘请求和tap和其他UI事件的通知。例如,下图显示了一个重绘事件,然后是一个tap事件,然后是两个重绘事件。事件循环以先入先出的顺序从队列中接收事件。
https://stackoverflow.com/questions/70417324
复制相似问题