個人的なメモ

Tomohiro Suzuki @hiro128_777 のブログです。Xamarin に関する事を中心に書いています。 Microsoft MVP for Development Technologies 2017- 本ブログと所属組織の公式見解は関係ございません。

.NET 6 Updateの整理(随時更新中)

.NET 6 もとうとう RC1 がリリースされました。Preview1 から Preview7 まで段階的に情報や新機能がリリースされており、まとまった情報がないのでちょっと整理してみました。
  
内容が多いため、記事は随時更新中です。
  

  

NETプラットフォームの統合

Xamarin の一部である AndroidiOS、および macOS の 機能の統合が完了します。
devblogs.microsoft.com
  

サポート

.NET 6は2021年11月にリリースされ、LTSリリースとして3年間サポートされます(2024年11月まで)。
github.com
  

対応プラットフォーム

動作プラットフォームが追加され以下のようになりました。

   既存対応        新規対応    
Windows x86, x64 Arm64
Linux Arm32, Arm32 Alpine, Arm64, Arm64 Alpine, x64, x64 Alpine
Android x64, Arm32, Arm64
iOS x64(シミュレータ), Arm32, Arm64
Mac macOS x64, Arm64, MacCatalyst

  
詳細は以下をご覧ください。
github.com
 
 

.NET 6 のターゲットフレームワークモニカ(TFM)

新しいプラットフォームのサポートの追加で、TFM が追加されています。
TFM は csproj ファイルの TargetFramework セクションに記載します。

<TargetFramework>net6.0</TargetFramework>


.NET 6 にはOS固有のバインディングを含む以下の TFM があります。

devblogs.microsoft.com
  

SDKワークロード

TFMが、主要な機能とオプションの組み合わせで表現されることに合わせて、SDK自体も主要な機能と各ワークロードのオプションに分割されています。.NET 6 では新たに追加された、.NET MAUI、AndroidiOS、WebAssembly が別のワークロードとして用意されています。これは、これまでのような、すべての機能を含むモノリシック SDK では、ビルド時間長くなり、配布サイズも大きくなってしまうからです。
  
詳細は以下をご覧ください。
devblogs.microsoft.com

  
dotnet workload list コマンドを実行すると、以下のようにインストールされているすべてのワークロードが一覧表示されます。
docs.microsoft.com
 

Installed Workload Ids
----------------------
android-aot
ios
maccatalyst
macos
maui
tvos
wasm-tools

 
.NET 7 では、ASP.NETWindows デスクトップなどのコンポーネントもオプションにする予定となっています。(例えば net7.0-aspnet のような TFM が追加されるということになると予想されます。)
  

パフォーマンスの向上

.NET 6 ではランタイムに対する多数のパフォーマンス改善が行われています。ライブラリ開発者の方には詳細を理解することがとても有効ですが、アプリ開発者の場合、.NET6 をターゲットフレームワークにすれば自動的にパフォーマンスが改善するものも多いので、一旦は特に意識せずに利用できます。

具体的にどのような手法でパフォーマンスを改善しているかをイメージするために、JITコンパイラの「インライン化による最適化」の例を簡単にご紹介します。
  

JIT(ジャストインタイムコンパイラ)の改善

例えば、改善項目の一つである「インライン化による最適化」は、コンパイラがメソッドの呼び出し先からコードを取得し、それを呼び出し元に直接出力するプロセスです。これにより、メソッド呼び出しのオーバーヘッドが回避され、例えば、呼び出し先のコンテンツを呼び出し元のコンテキストに公開し、メソッド呼び出しを操作全体を定数に変換できます。

ただし、インライン化を行うとすべての呼び出し元に呼び出し先の結果のコードがコピーされるため、アセンブリコードのサイズが肥大しまい、場合によってはCPUのキャッシュメモリからあふれてしまい、かえって速度が低下します。それを最適化するために、インライン化するかどうかの判断を厳密に行うように改善し、パフォーマンスを向上させています。

.NET 6 ではこのような地道なパフォーマンス改善を多数実施されています。詳細は以下のリンクを参照してください

参考情報:Performance Improvements in .NET 6
devblogs.microsoft.com
  

ファイルIOの改善

.NET 6 では FileStream がほぼ完全に書き直されており、速度と信頼性のが高まりました。また、複数のバッファーに対応した(Scatter / Gather IO)新しい API が導入されています。Scatter / Gather IO を使用すると、単一の sys-call で複数のバッファーを渡すことにより、高コストの sys-call の数を減らすことができます。
 
関連記事 
hiro128.hatenablog.jp
  
  

FileStreamを使用しない、ファイルの読み取りと書き込み

.NET 6には、FileStreamを使用せずにファイルの読み取りと書き込みを可能にする新しい低レベルAPIが追加されています。

devblogs.microsoft.com