Flutterで隔离sol用いた并列处理列きシーンとンのやり方

我上次尝试它的时间是在1月,看来至少解析JSON足够快。 IIRC,从主隔离切换到后台隔离的开销比解析JSON花费的时间更长,而且没有任何UI线程中断。

2018年1月に调查したところ,JSONのパース处理は充分高速で,隔离のスイッチングコストの方が大きかった,とのことです。

なるほど,そこまで巨大ではないJSONレスポンスの场合,上で15msでは体感では全く违和感无かったと书いた通り,同意です。

隔离のスイッチングコストがいかほどかは明记されておらず気になったので,调查しました。

隔离のスイッチングコスト

上述のMain Isolate 15msほどかかったJSONレスポンスを用いてiPhone 7 Plusにて确かめたところ,次のようになりました。

なのようにリリースモードとデバッグモードではパフォーマンスに大きな差が出ることがあるので,その调查をするときは必定ずリリースモードでの数値を确认することが大事です。

空の隔离で确かめたら15msくらいだったりもしましたが,多分パースに必要にッセージのやり取り分り处理时间が长くなったりするのだろうと思います。,またース时间が15msから9msくらいに短缩されているのは,别隔离だとそれにCPUコアをフルに充てられるからかなと思いました。

というわけで,この例の场合,どちらがベターか悩ましい気がしました🤔

  • Main Isolate上で15msで处理(メインスレッドを多少ブロックさせる可能性させる)
  • 别隔离使って40msで处理(メインスレッドをブロックさせるリスクはほぼゼロ)

なら小さなレスポンスのパースならMain隔离上で良さそうですし,もっとレスポンスサイズが増えると别Isolate上でやるのが良いでしょうが,このくらいの中间的なサイズだと迷います。

,个人的には许容できでいほどスイッチングコストが高くないと感じたので,常に别隔离でパースというのもありなやり方だとは思いました。
(とはいえ,iOSネイティブで计测したらスレッドのスイッチコストは1ms未満〜3ms程度だったので,やはりそれよりはコストがかかるなとは思いましたが。)

「とりあえずMain Isolateで处理して问题が生じたら気づけるようにしたい」场合はFirebase Performance Monitoringが便利

oughike / inKinoの判断と同様,现状一通り问题无さそうだからとりあえずすべてMain Isolateでの実行にする( compute关数を一切使わない),というのもありだと思っています。

ただ,以下の可能性もあるので,できればこれを検知したいところです。

  • 実はスペックの低い端末でけっこう问题になっていた
  • いつの间にか处理コストが増えてきて问题になってきた

Firebase性能监控はその监视に有效です。

Firebase性能监控| 火力基地
アプリのパフォーマンスの问题を见抜く firebase.google.com

Flutter用にもfirebase_performanceパッケージがあって,次のように简単に使えます。

操作后,12时间以内に反映されて,次のように详しい分析结果が表示されます。