Dart2.15リリースノート和訳要約
2021年12月9日に発表されたDart2.15リリースノートの日本語訳の要約記事です。
dart pub command
の変更とUnicodeに関するプログラム言語の脆弱性
、pub.devの脆弱性
に関しては触れていません。
isolates
に2種類の変更
Isolate classは、並列処理関連のライブラリです。
今回のアップデートで並列処理のパフォーマンスが向上し、send methodで送信できるオブジェクトが拡張された。
並行処理に関するドキュメント
並行処理に関するサンプルプログラムisolate groups の追加
メリット
- 実行速度上昇
- 可変オブジェクトへのアクセスを防止する(つまり、不変オブジェクトにするということかな?)
- 共有ヒープで実装
- Isolate間でオブジェクトを渡すことが可能(= プロセスを分離可能)
解説
groups内のIsolate
は、プログラム実行中の内部データ構造を共有するため、プログラム構造を初期化する必要性がなくなりました。これにより、実行速度が100倍以上早くなり、生成されたIsolate
のメモリ生成量が10~100倍減少した。
またDart2.15以前は、バッファを呼び出す速度が描画より遅いとUIがフリーズする可能性がありました。そのため、共有ヒープ内でオブジェクトを渡すことにより、プロセスを分離可能にしたことで問題を解決しました。
Flutterを2.8にアップグレードすることにより、自動でパフォーマンスが向上します。
solate message passing mechanism
のリファクタリング
メリット
- 中小規模のメッセージの受け渡しが約8倍高速化
- send()の対応オブジェクトが拡大
- Null,bool,int,double,String,List or Map,TransferableTypedData,SendPort,Capability
解説
中小規模のメッセージの受け渡しを約8倍高速化した。送信処理を高速化し、メッセージの受信がほとんど一定時間で行われます。
またIsolate
が相互に送信できるオブジェクトを拡大(Null,bool,int,double,String,List or Map,TransferableTypedData,SendPort,Capability
を追加)した。
関数ポインタ
の追加
関数ポインタのメリットは直接関数名を書いて呼び出さなければいけなかった所で
間接的に呼び出すことが可能になるという点です。
これによって関数を呼び出す側のコードがシンプルになり可読性が上がります。
引用元 : 関数ポインタの基本
class Greeter {
final String name;
Greeter(this.name);
void greet(String who) {
print('$name says: Hello $who!');
}
}
void main() {
final m = Greeter('Michael');
final g = m.greet; // g holds a function pointer to m.greet.
g('Leaf'); // Invokes and prints "Michael says: Hello Leaf!"
}
メリット
dart:core libraryの使用時、活用することで効率的にコーディングできる。
foreach()
でiterableを呼び出す
例:final m = Greeter('Michael');
['Lasse', 'Bob', 'Erik'].forEach(m.greet);
// Prints "Michael says: Hello Lasse!", "Michael says: Hello Bob!",
// "Michael says: Hello Erik!"
.map()
でText Widget
を呼び出す
例: class FruitWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Column(
children: ['Apple', 'Orange'].map(Text.new).toList());
}
}
非ジェネリックメソッド
を作成可能
関数ポインタの実装により、非ジェネリック(型パラメータを宣言していない)メソッドが作成可能になりました。
メリット
配列は、複数の要素を格納するために使用できます。 1つの欠点は、同じデータ型の要素を格納できることです。コレクションと呼ばれる多くの値またはオブジェクトを格納するために使用できるC#のクラスがあります。コレクションは、オブジェクトの保存、更新、削除、検索、並べ替えに役立ちます。コレクションのサイズは動的に増減できます。
一部の非ジェネリックコレクションクラスは、ArrayList、SortedList、Stack、Queue、およびHashTableです。各コレクションクラスはIEnumerableインターフェイスを実装します。これは、foreachループを使用して、コレクション内の項目の要素を反復処理するのに役立ちます。
引用元 : C#の非ジェネリックコレクションとは何ですか?
つまりメソッドを使い回し、無駄なメソッドを減らすことが可能になりました。
例:非ジェネリックメソッド
T id<T>(T value) => value;
int Function(int) intId = id; // Pre-2.15 workaround.
T id<T>(T value) => value;
var intId = id<int>; // New in 2.15.
例:非ジェネリック関数オブジェクト
const fo = id; // Tear off `id`, creating a function object.
const c1 = fo<int>; // error
const fo = id; // Tear off `id`, creating a function object.
const c1 = fo<int>; // OK
型リテラルを更新
var z = typeOf<List<int>>(); // Pre-2.15 workaround.
var z = List<int>; // New in 2.15.
enum
の進化
以前のenumと比較するサンプル
.name
でStringを取得
.name
でStringが取得可能
enum MyEnum {
one, two, three
}
void main() {
print(MyEnum.one.name); // "one"
}
名前でenum内を検索可能
print(MyEnum.values.byName('two') == MyEnum.two); // "true"
名前と値のペアを取得可能
final map = MyEnum.values.asNameMap();
print(map['three'] == MyEnum.three); // Prints "true".
圧縮ポインタ
が実装
Androidで圧縮ポインタにより、メモリ使用量が大幅に削減される。
Dart2.15では、Androidのみサポートしている。だが、将来的にiOSでも有効にすることを検討している。
解説(和訳要約)
32bitアドレス空間(最大4GBのメモリ)のみをサポートする場合、64bit SDKがポインターを効率よく表現する手法です。ポインタを圧縮すると、メモリが大幅に削減します。GPay App
を使用した内部テストでは、ヒープサイズが約10%減少した。
DartSDKの構成オプションの背後にあり、FlutterSDK version2.8
は、Androidのビルドでこの構成を有効にしている。
DartDevToolsがDartSDKに標準実装
Dart DevToolsがDartSDKに標準実装になりました。
DevToolsのドキュメント
Discussion