BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース .NET 5のランタイム改善 - 機能的実装からハイパフォーマンス実装へ

.NET 5のランタイム改善 - 機能的実装からハイパフォーマンス実装へ

原文(投稿日:2020/12/01)へのリンク

.NETランタイムのソフトウェアアーキテクトたちが先頃、.NETランタイムの改善とその実現方法についてプレゼンテーションを行った。

.NETチームのプリンシパルプログラムマネージャであるRich Lander氏と、同チームに所属するソフトウェアアーキテクトのStephan Toub、Jan Kotas両氏は.NET Conf 2020で、".NET 5 Runtime Deep Dive with Rich Lander and the Architects"と題したオンラインセッションを行った。スライドを使用しないこのセッションで氏らは、ARM64サポート、HTTP/3、単一ファイルアプリケーションのサポートなど、.NET 5ランタイムのさまざまな改善について発表した。

セッションの中で3氏は、これらすべての改善で使用した方策について説明した。通常、ランタイムに機能を追加する場合には、同チームが"機能的(functional)"実装と呼ぶ方法を用いている。この実装はパフォーマンス面で最適化されたものではなく、開発者や他の.NETチームがこの新機能の使用を開始して、フィードバックを提供することを目的とするものだ。続くフューチャーリリースサイクルの期間において、機能実装はパフォーマンス面で最適化される。必要なユースケースに対応するため、場合によっては、別の方策を用いて完全に再実装されることもある。多くの場合、このプロセスによって顕著なパフォーマンス向上が達成されるのだ。

技術コミュニティはこの説明を肯定的に受け入れている。"Pro .NET Memory Management"の著者でMicrosoft MVPのKonrad Kokosa氏はこの議論の内容を要約して、次のようなマインドマップを作成した。

Mind map of .NET 5 Runtime Deep Dive by @konradkokosa
出典: https://twitter.com/konradkokosa/status/1326635315616952321

ランタイム改善で論じられた最初の領域は、.NETのARM64サポートだ。.NET Core 3でもARM64のサポートはサポートされていたが、"機能的"実装に留まっていた。.NET 5におけるARM64のパフォーマンス向上の大きな要因となったのは、ARMのハードウェア組み込み関数サポートの導入だ。そのようなハードウェア機能の一例であるSIMD(Single Instruction、Multiple Data)は、データレベルの並列性を利用して、複数のデータポイントで同じ操作を同時実行する命令クラスである。Toub氏はこのハードウェア組み込み関数を使用したプロセスを、中間ステップと比較してみせた。

最初に基本的な"for"ループを記述して、ここで話題にしている付加的トランジスタによるアドバンテージを使用しないものとします。次には、もう少し低いレベルに踏み込んで、複雑なコードを記述することができます。既存の型である"Vector"を使用すれば、jitはそれを使用可能な組み込み関数に変換することを試みます。これによって一定の最適化が可能になるのです。利用可能な特定の操作セットに対して高度な最適化を行いたいのであれば、さらに内部に踏み込んで、自身で組み込み関数を使用することもできます。

その他の改善領域としては、HTTP/2のパフォーマンス改善や、HTTP/3 over QUICの機能サポートなどがある。HTTP/2実装のパフォーマンス改善の多くは、アンマネージドなC++コードとマネージドC#コードによる実装と関連している。Lander氏は、"マネージド言語はこのような低レベルの超パフォーマンスセンシティブなコンポーネントには不向きだ、というような考え方"がいまだ存在することを指摘する。Toub氏がそれについて説明している。

数値計算だけを行うような、純粋なCPU自体の計算処理の類であれば、一般論として、C/C++コードを使った"全速力(pedal to the metal)"に焦点を合わせた方がパフォーマンスを向上できるでしょう。それ以外のネットワークやI/Oを伴う処理では、ビットやバイトをシャッフルする処理が大部分なので、サイクル毎に最大数の命令を処理するような必要はないのです。データをあちこちにコピーしたり、"どうすれば自分の操作をもっと単純に表現できるか"を問題とするような場合であれば、もっと実験を重ねることで、コードをより速くイテレーションすることが可能になります。

同じ方法で、チームは現在、いくつかのQUIC実装を行っている。そのひとつは実際に機能するアンマネージドなライブラリだが、C#で書き直した上で高度に最適化された実装も存在する。これらの実装をプラットフォームで使用する時には、プラットフォーム自体も改善することになる、とToub氏は述べている。以前には、HTTPスタック開発作業の一環として、TCPオペレーションを大幅に拡張した例もある。現在はUDP APIにさまざまな不具合が見つかっているので、すべての人たちのメリットのために修正される予定である。

この記事に星をつける

おすすめ度
スタイル

BT