SlideShare a Scribd company logo
ASP.NET Core の
パフォーマンスを
支える
I/O Pipeline と
Channel
.NET Conf 2022 Recap Event 福岡
2022/11/25
株式会社オープンストリーム
ジョニー
@joni2nja
about:config
ジョニー
@joni2nja
https://joni.carrd.co/
https://medium.com/@joni2nja
https://github.com/jo-ninja
今日お話しすること
System.IO.Pipelines と
System.Threading.Channels の紹介
.NET 7 でのパフォーマンス改善
https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/
PDF版:https://aka.ms/net7-perf-pdf
ASP.NET Core の パフォーマンス
Do more with less
より少ないリソース(資源や時間)で
より多くのことを実現する
System.IO.Pipelines
高性能な I/O をより簡単に行えるように
設計されたライブラリ
https://learn.microsoft.com/en-us/dotnet/standard/io/pipelines
どのような課題を解決するのか?(1/5)
データプロトコルのパース処理で、ストリームから byte 列を
読み込む典型的な例:
どのような課題を解決するのか?(2/5)
ほとんどのストリーム系
API は、データコピー
前提で設計されている。
例:
https://github.com/dotnet/runtime/blob/5c420f1aa78455c803f6d6b17eb4543ad728461c/src/libraries/System.Private.CoreLib/src/System/IO/MemoryStream.cs#L337-L344
どのような課題を解決するのか?(3/5)
⚠️ 1回の呼び出しで対象のデータ(例:EOL)を受信/読み込み
できない場合がある
💡EOLが見つかるまでバッファの確保・リサイズ等をする
⚠️ 1回の呼び出しで複数EOLが返ってくる場合もある
💡それぞれパース・処理する
どのような課題を解決するのか?(4/5)
⚠️ バッファ確保・リサイズ問題
⚠️頻繁にデータのコピーが発生
⚠️アロケート(割り当て)したメモリはコンパクト化されない
⚠️GCへの負担が増加
💡バッファの繰り返しアロケートを避ける
ために ArrayPool<byte> を使用し、処理終了後は
バッファをプールに返却する
💡一定サイズのバッファのリストを使用する
改善された(不完全)例:👉
サンプルはこちら:
https://learn.microsoft.com/en-us/dotnet/standard/io/pipelines
System.IO.Pipelines
System.IO.Pipelinesの目標は、これらの課題を解決したい、かつ
より簡単に書けるようにしたい
✅ストリーミングデータを高速にパースする。
✅コードの複雑さを軽減する
System.IO.Pipelines の場合
✅明示的にバッファをアロケート
する必要がない
✅バッファの管理はすべて
PipeReaderとPipeWriterに
任せる
✅ユーザコードは複雑な
バッファ管理ではなく、
ビジネスロジックに集中する
ことができる
Pipe
• Pipe クラスを使用し、 PipeWriter と PipeReader のペアを
作成することができる
• PipeWriter に書き込まれたすべてのデータは、PipeReader
で利用できる
PipeWriterで
書き込み
Pipe覗き見
• 実際に「consume」することなく、Pipe内のデータを覗き見る
ことができる
Pipe
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
1GBのデータを読み込もうとしても~
Segment が増えるだけで、LOHに配置されないのが有り難い😉
つまり
https://www.youtube.com/watch?v=1koWtKkKb_o - High performance IO with System.IO.Pipelines
https://www.youtube.com/watch?v=tLnQsNTfl9Q - .NET Design Review: System.IO.Pipelines
System.Threading.Channels
プロデューサーとコンシューマーの間で非同期に
データを転送するためのデータ構造。
Channel を使えば、独自に同期やロックを実装
する必要がなくなる。
https://learn.microsoft.com/en-us/dotnet/core/extensions/channels
プロデューサー/コンシューマー?🤔
System.IO.Pipelines と何が違う?
Pipelines 🆚 Channels
System.IO.Pipelines
• API も実装も、 byte 例を処
理するのに最適化されている
• 1プロデューサー:1コン
シューマー
System.Threading.Channels
• API も実装も、任意のデータ
をスレッド間で転送するため
に最適化されている
• 1..nプロデューサー:1..nコン
シューマー
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
BlockingCollectionと何が違う?
BlockingCollection involves blocking; there are no
task-based APIs to perform work asynchronously.
Channels is all about asynchrony; there are no
synchronously-blocking APIs — Stephen Toub.
Channel ファクトリ作成
Channel.CreateBounded<T>()
最大容量を指定した Channel
を作成する
Channel.CreateUnbounded<T>()
任意の数のプロデューサー/コ
ンシューマーが同時に使用でき
るチャネルを作成する
任意のデータ
ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
❓
例:データ変換→アップロード
System.IO.Pipelines
+
System.Threading.Channels
=
🚀
ご清聴ありがとうございました

More Related Content

What's hot (20)

オブジェクト指向プログラミングのためのモデリング入門 by 増田 亨, has 47 slides with 38157 views.
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
47 slides38.2K views
オブジェクト指向エクササイズのススメ by Yoji Kanno, has 85 slides with 59628 views.
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
85 slides59.6K views
オンラインゲームの仕組みと工夫 by Yuta Imai, has 56 slides with 882705 views.
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
56 slides882.7K views
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ... by Kohei Nakamura, has 32 slides with 3479 views.
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Kohei Nakamura
32 slides3.5K views
DockerコンテナでGitを使う by Kazuhiro Suga, has 8 slides with 20556 views.
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
8 slides20.6K views
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 by Yoshifumi Kawai, has 52 slides with 5228 views.
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
52 slides5.2K views
Go言語のスライスを理解しよう by Yasutaka Kawamoto, has 60 slides with 31359 views.
Go言語のスライスを理解しようGo言語のスライスを理解しよう
Go言語のスライスを理解しよう
Yasutaka Kawamoto
60 slides31.4K views
オブジェクト指向の設計と実装の学び方のコツ by 増田 亨, has 76 slides with 101498 views.
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
76 slides101.5K views
オブジェクト指向プログラミングのためのモデリング入門 by 増田 亨, has 47 slides with 38157 views.
オブジェクト指向プログラミングのためのモデリング入門オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
47 slides38.2K views
オブジェクト指向エクササイズのススメ by Yoji Kanno, has 85 slides with 59628 views.
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
85 slides59.6K views
オンラインゲームの仕組みと工夫 by Yuta Imai, has 56 slides with 882705 views.
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
Yuta Imai
56 slides882.7K views
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ... by Kohei Nakamura, has 32 slides with 3479 views.
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 (  Redmine of one plant 2022 ...
ある工場の Redmine 2022 〜ある工場の Redmine 5.0 バージョンアップ〜 ( Redmine of one plant 2022 ...
Kohei Nakamura
32 slides3.5K views
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 by Yoshifumi Kawai, has 52 slides with 5228 views.
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Yoshifumi Kawai
52 slides5.2K views
オブジェクト指向の設計と実装の学び方のコツ by 増田 亨, has 76 slides with 101498 views.
オブジェクト指向の設計と実装の学び方のコツオブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
76 slides101.5K views

Similar to ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel (20)

ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説 by Akira Inoue, has 37 slides with 14856 views.
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
Akira Inoue
37 slides14.9K views
.NET アプリを改善して実践する継続的インテグレーション by Yuta Matsumura, has 33 slides with 341 views.
.NET アプリを改善して実践する継続的インテグレーション.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーション
Yuta Matsumura
33 slides341 views
コンテナーによるIT基盤変革 - IT infrastructure transformation - by 日本ヒューレット・パッカード株式会社, has 109 slides with 651 views.
コンテナーによるIT基盤変革 - IT infrastructure transformation -コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -
日本ヒューレット・パッカード株式会社
109 slides651 views
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像 by Akira Inoue, has 51 slides with 2845 views.
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
Akira Inoue
51 slides2.8K views
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること by 日本マイクロソフト株式会社, has 27 slides with 1524 views.
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること 【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
【BS11】毎年訪れる .NET のメジャーバージョンアップに備えるために取り組めること
日本マイクロソフト株式会社
27 slides1.5K views
de:code 2019 Cloud トラック 総まとめ! by Minoru Naito, has 85 slides with 1023 views.
de:code 2019 Cloud トラック 総まとめ!de:code 2019 Cloud トラック 総まとめ!
de:code 2019 Cloud トラック 総まとめ!
Minoru Naito
85 slides1K views
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code by Takashi Okawa, has 48 slides with 472 views.
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Codeどっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
Takashi Okawa
48 slides472 views
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説 by Akira Inoue, has 37 slides with 14856 views.
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
ASP.NET 新時代に向けて ~ ASP.NET 5 / Visual Studio 2015 基礎解説
Akira Inoue
37 slides14.9K views
.NET アプリを改善して実践する継続的インテグレーション by Yuta Matsumura, has 33 slides with 341 views.
.NET アプリを改善して実践する継続的インテグレーション.NET アプリを改善して実践する継続的インテグレーション
.NET アプリを改善して実践する継続的インテグレーション
Yuta Matsumura
33 slides341 views
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像 by Akira Inoue, has 51 slides with 2845 views.
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
ASP.NET vNext / Visual Studio "14" に見る .NET の未来像
Akira Inoue
51 slides2.8K views
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code by Takashi Okawa, has 48 slides with 472 views.
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Codeどっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
Takashi Okawa
48 slides472 views

Slideshows for you (20)

続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2 by Preferred Networks, has 46 slides with 2019 views.
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
Preferred Networks
46 slides2K views
Pythonによる黒魔術入門 by 大樹 小倉, has 35 slides with 46235 views.
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
35 slides46.2K views
イミュータブルデータモデル(入門編) by Yoshitaka Kawashima, has 24 slides with 193212 views.
イミュータブルデータモデル(入門編)イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
24 slides193.2K views
それはYAGNIか? それとも思考停止か? by Yoshitaka Kawashima, has 41 slides with 30993 views.
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
41 slides31K views
DockerコンテナでGitを使う by Kazuhiro Suga, has 8 slides with 20556 views.
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga
8 slides20.6K views
トランザクションスクリプトのすすめ by pospome, has 14 slides with 3093 views.
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
14 slides3.1K views
ドメイン駆動設計 基本を理解する by 増田 亨, has 134 slides with 118451 views.
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
134 slides118.5K views
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3 by Preferred Networks, has 36 slides with 2508 views.
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Preferred Networks
36 slides2.5K views
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2 by Preferred Networks, has 46 slides with 2019 views.
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
続・PFN のオンプレML基盤の取り組み / オンプレML基盤 on Kubernetes 〜PFN、ヤフー〜 #2
Preferred Networks
46 slides2K views
トランザクションスクリプトのすすめ by pospome, has 14 slides with 3093 views.
トランザクションスクリプトのすすめトランザクションスクリプトのすすめ
トランザクションスクリプトのすすめ
pospome
14 slides3.1K views
ドメイン駆動設計 基本を理解する by 増田 亨, has 134 slides with 118451 views.
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
134 slides118.5K views
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3 by Preferred Networks, has 36 slides with 2508 views.
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Preferred Networks
36 slides2.5K views

More from Joni (13)

.NET Framework で ​C# 8って使える? ​YESとNO! by Joni , has 24 slides with 1616 views.
.NET Framework で ​C# 8って使える? ​YESとNO!.NET Framework で ​C# 8って使える? ​YESとNO!
.NET Framework で ​C# 8って使える? ​YESとNO!
Joni
24 slides1.6K views
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築 by Joni , has 37 slides with 3745 views.
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
Joni
37 slides3.7K views
Fiddler 使ってますか? by Joni , has 14 slides with 3979 views.
Fiddler 使ってますか?Fiddler 使ってますか?
Fiddler 使ってますか?
Joni
14 slides4K views
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例 by Joni , has 55 slides with 247 views.
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
Joni
55 slides247 views
ASP.NET パフォーマンス改善 by Joni , has 19 slides with 24675 views.
ASP.NET パフォーマンス改善ASP.NET パフォーマンス改善
ASP.NET パフォーマンス改善
Joni
19 slides24.7K views
Introduction to .NET by Joni , has 52 slides with 97 views.
Introduction to .NETIntroduction to .NET
Introduction to .NET
Joni
52 slides97 views
Tips and Tricks of Developing .NET Application by Joni , has 18 slides with 75 views.
Tips and Tricks of Developing .NET ApplicationTips and Tricks of Developing .NET Application
Tips and Tricks of Developing .NET Application
Joni
18 slides75 views
Introduction to Html by Joni , has 13 slides with 90 views.
Introduction to HtmlIntroduction to Html
Introduction to Html
Joni
13 slides90 views
.NET Framework で ​C# 8って使える? ​YESとNO! by Joni , has 24 slides with 1616 views.
.NET Framework で ​C# 8って使える? ​YESとNO!.NET Framework で ​C# 8って使える? ​YESとNO!
.NET Framework で ​C# 8って使える? ​YESとNO!
Joni
24 slides1.6K views
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築 by Joni , has 37 slides with 3745 views.
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
.NET Core 3.0 で Blazor を使用した​フルスタック C# Web アプリ​の構築
Joni
37 slides3.7K views
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例 by Joni , has 55 slides with 247 views.
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
Fukuoka.NET Conf 2018: 挑み続ける!Dockerコンテナによる ASP.NET Core アプリケーション開発事例
Joni
55 slides247 views
ASP.NET パフォーマンス改善 by Joni , has 19 slides with 24675 views.
ASP.NET パフォーマンス改善ASP.NET パフォーマンス改善
ASP.NET パフォーマンス改善
Joni
19 slides24.7K views
Tips and Tricks of Developing .NET Application by Joni , has 18 slides with 75 views.
Tips and Tricks of Developing .NET ApplicationTips and Tricks of Developing .NET Application
Tips and Tricks of Developing .NET Application
Joni
18 slides75 views

ASP.NET Core の ​ パフォーマンスを支える ​ I/O Pipeline と Channel