Dart リスト(配列)を結合する

Dart リスト(配列)を結合する

Dartで、リスト(配列)を結合するコードを記述してます。方法は幾つかありそうですが、ここでは「+」演算子を使用した方法や「…」を使用する方法などの4つの方法を掲載してます。それぞれの実行時間を比較した結果も掲載してます。

環境

  • OS windows11 home
  • Dart 2.18.1

リスト(配列)を結合する

リスト(配列)を結合するには、以下の4つの方法があります。

リスト + リスト + リスト

[...リスト,...リスト,...リスト]

[リスト,リスト,リスト].expand((x) => x).toList()

リスト..addAll(リスト)..addAll(リスト)

実際に、使用して結合してみます。

void main() {
  var list1 = [1, 2, 3];
  var list2 = [4, 5, 6];
  var list3 = [7, 8, 9];

  print(list1 + list2 + list3); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

  print([...list1, ...list2, ...list3]); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

  print([list1, list2, list3].expand((x) => x).toList()); // [1, 2, 3, 4, 5, 6, 7, 8, 9]

  print(list1..addAll(list2)..addAll(list3)); // [1, 2, 3, 4, 5, 6, 7, 8, 9]
}

実行結果を見ると、結合されていることが確認できます。

パフォーマンス

パフォーマンスは「…」を使用したスプレッド構文が一番良さそうです。

ここでは「benchmark_harness」を使用して計測してます。
「pubspec.yaml」に「benchmark_harness」を追加すれば使用可能です。

name: sample
dependencies:
  benchmark_harness: any
environment:
  sdk: '>=2.10.0 <3.0.0'

実際に計測するコードとなります。

import 'package:benchmark_harness/benchmark_harness.dart';

  var list1 = [1, 2, 3];
  var list2 = [4, 5, 6];
  var list3 = [7, 8, 9];

class Benchmark1 extends BenchmarkBase {
  const Benchmark1() : super('+');

  @override
  void run() {
    final newList = list1 + list2 + list3;
  }
}

class Benchmark2 extends BenchmarkBase {
  const Benchmark2() : super('...');

  @override
  void run() {
    final newList = [...list1, ...list2, ...list3];
  }
}

class Benchmark3 extends BenchmarkBase {
  const Benchmark3() : super('expand');

  @override
  void run() {
    final newList = [list1, list2, list3].expand((x) => x).toList();
  }
}

class Benchmark4 extends BenchmarkBase {
  const Benchmark4() : super('addAll');

  @override
  void run() {
    final newList = list1..addAll(list2)..addAll(list3);
  }
}

void main() {
  Benchmark1().report();
  Benchmark2().report();
  Benchmark3().report();
  Benchmark4().report();
}

実行結果(us : マイクロ秒)

<1回目>
+(RunTime): 3.269116 us.
...(RunTime): 2.522362477637522 us.
expand(RunTime): 9.045374773126134 us.
addAll(RunTime): 7.318390590804705 us.

<2回目>
+(RunTime): 3.098101333333333 us.
...(RunTime): 2.5072475 us.
expand(RunTime): 10.892123100599923 us.
addAll(RunTime): 3.6738611630694185 us.

<3回目>
+(RunTime): 3.104633333333333 us.
...(RunTime): 2.415287584712415 us.
expand(RunTime): 9.12561155954413 us.
addAll(RunTime): 2.645627 us.