flutter 多个分离株vs 1个分离株

nqwrtyyt  于 2022-12-30  发布在  Flutter
关注(0)|答案(2)|浏览(192)

隔离如何跨CPU核心分布
在Dart中,您可以同时运行多个分离株,我还没有找到使用分离株的指南或最佳实践。
我的问题是,同时运行的隔离的数量将如何影响总体CPU使用率和性能,使用少量隔离(甚至仅一个)是否更好。

vptzau2j

vptzau2j1#

    • 每个线程一个分离菌株**

一个隔离占用一个平台线程-使用多个隔离调试Dart/Flutter应用时,您可以在 * VSCode * 的 * 调用堆栈 * 窗格中观察每个隔离创建的线程。如果感兴趣的工作负载允许并行,您可以通过隔离获得巨大的性能提升。
注意,Dart明确地抽象了实现细节,而文档避免了分离菌株及其intrinsic的调度细节。

    • 分离菌株数量= ± CPU内核数量**

根据经验确定隔离/线程数时,您可以将内核数作为初始值。您可以使用import 'dart:io';并使用Platform.numberOfProcessors属性来确定内核数。不过,需要进行微调实验,以确定哪个数量更有意义。有许多因素会影响最佳线程数:

  1. CPU中存在同步多线程(SMT),例如Intel超线程
    1.指令级并行性(ILP)和为您的代码生成的特定机器代码
    1.中央处理机体系结构
    1.移动/智能手机场景与台式机-例如,英特尔CPU具有相同的内核,不太可能节流。智能手机具有高效和高性能的内核,它们容易小跑,创建大量线程可能会导致更糟糕的结果,因为操作系统会降低代码速度。
    例如,对于我的一个Flutter应用程序(使用多个分离菌株并行处理文件),我凭经验得出以下代码片段,用于确定要创建的分离菌株数量:
var numberOfIsolates = max(Platform.numberOfProcessors - 2, 2)
    • 分离菌株不是线程**

isolate提供的模型比标准线程模型所建议的要严格得多。

  • 隔离群不共享内存***vs***线程可以读取彼此的变量 *。有一些技术上的例外,例如,由于Flutter 2.5.0周围的隔离群使用一个堆,因此在隔离群之间共享不可变类型(如字符串)也有例外--尽管它们是实现细节,不会改变概念。

Isolates communicate only via messages与****线程中的大量同步原语(临界区、锁、信号量、互斥锁等)。
明显的折衷是,Isolate不易于出现多线程编程问题(棘手的错误、调试、开发复杂性),但提供的实现并行性的功能较少。
在Dart/Flutter中,只有2种方法可以处理分离菌株:
1.低级,Dart样式-使用Isolate类生成单个分离菌株,设置消息发送/接收端口、代码入口点。

  1. Flutter中的更高级别Compute辅助函数-它获取输入参数,使用定义的入口点创建新分离菌株,处理输入并提供单个结果-而不是来回通信、事件流等,请求-响应模式。
    请注意,在Dart/Flutter SDK中没有任务并行库等并行API(TPL)在. NET中提供多核CPU优化的API,以在多个线程上处理数据,例如并行排序集合。大量算法可以从使用线程的并行性中受益,但在没有共享内存的隔离模型中不可行。此外,也没有隔离池,一组正在运行并等待传入任务的隔离(我不得不自己创建一个https://pub.dev/packages/isolate_pool_2)。
    • P.S.:**SMT、ILP和其他东西对多线程性能的影响可以通过以下CPU基准测试(https://play.google.com/store/apps/details?id=xcom.saplin.xOPS)观察到-例如,可以看到,在多个线程进行计算方面通常存在一个最佳点。它大于内核数量。例如,在我的Intel i7第八代MacBook上,每个CPU有6个内核和12个线程,在线程数量大约是内核数量的4倍时观察到最佳性能。
b5buobof

b5buobof2#

在CPU内核之间分配隔离是由操作系统完成的。但每个隔离对应一个线程。要使用的隔离数量将取决于物理可用的CPU内核数量。
这是由一个简短的文章,可在这里说明:https://martin-robert-fink.medium.com/dart-is-indeed-multi-threaded-94e75f66aa1e

相关问题