🦁
【Dart】非同期処理を複数行う際の時間短縮方法例
こんにちは。
プログラミングにおいて繰り返し処理(forループや.map関数など)は必ず出てくる処理ですが、ループ内の処理1件の時間が長くなると、その分実行時間は長くなってしまいますよね。
例えばですが、先生と生徒が存在するアプリがあり、先生は担当生徒のドキュメントIDリストを保持しているとします。
この時、先生アカウントの持つ生徒IDリストをもとにFireStoreにそれぞれアクセスし、新たにClassroomインスタンスを作るような場合を想定してみましょう。
これをfor文の中で1件ずつ行うとすると、仮に1件の処理が2秒ほどでも、生徒数が増えれば増えるほど全体の処理時間が増えるため、ローディングが長くなったり面倒ごとが多くなります。
そのような悩みは、以下のように「並行処理」を行うことで解決できます。
通常のforループ
final _list = [];
for(final id in ids){
// ここに2秒ほどかかる処理
_list.add(/* インスタンス */);
}
仮にids.lengthが10だったとすると、通常の場合は20秒ほどかかってしまい、UX的にもよろしくないですよね。
並行処理を使用した非同期タスク
final _list = [];
List<Future<void>> _futures = ids.map((id) async {
// 2秒ほどかかる処理
_list.add(/* インスタンス */);
}).toList();
await Future.wait(_futures);
イメージとしては、処理を走らせる道をリストの数だけ横に並べて、一斉に処理をスタートさせる感じです。
仮にids.lengthが同じ10だったとしても、一斉に処理が走るので1件分の時間で全体の処理が完了します。
同期処理の場合はcompute関数を使用した並列処理などもありますが、どちらかというと今回紹介した並行処理の方がよく使うと個人的には思います(個人開発でDBを使う場合などは特に)。
非同期処理を複数実行するパターンはいくつかありますが、こちらの記事が分かりやすいなと思いました。
気になる方は是非チェックしてみてくださいね。
それではまた。
Discussion