Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Blazor WebAssembly HostedのアプリにMessagePackを使ってみる
Search
tomokusaba
January 27, 2023
Programming
550
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Blazor WebAssembly HostedのアプリにMessagePackを使ってみる
Blazor WebAssembly HostedのアプリにMessagePackを使ってみる
.NETラボ 勉強会 2023年1月
tomokusaba
January 27, 2023
More Decks by tomokusaba
See All by tomokusaba
GitHub Copilot app時代の開発フロー
tomokusaba
0
46
オートマトンと字句解析でRoslynを読む
tomokusaba
0
140
GitHub Copilot appとGitHub Copilot CLIとVS CodeのCopilot Chat Agent Modeの使い分け
tomokusaba
0
140
GitHub Copilot app最速の発信の裏側
tomokusaba
1
540
自宅サーバの変遷
tomokusaba
0
850
Microsoft Build Keynoteふりかえり
tomokusaba
0
170
GitHub Copilot CLIでWebアクセシビリティを改善した話
tomokusaba
0
750
GitHub Copilot CLI で考える複数エージェント設計
tomokusaba
0
290
GitHub Copilot appで変わる GitHub Copilot CLI開発体験
tomokusaba
1
1.5k
Other Decks in Programming
See All in Programming
運用ダッシュボードの設計を誰も教えてくれないのだけどみなさんどうしてるんですか? - チームに監視するという文化を根付かせるための第一歩を踏みたい -
satoshi256kbyte
1
130
プロポーザルを書いてもらう
pvcresin
0
560
AIが無かった頃の素敵な出会いの話
codmoninc
1
470
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
仕様駆動開発へのトライを機に チームに適合する手法を模索し続けている話
freee
PRO
0
580
<title><a id="</title>君はこのHTMLをパースできるか"></a></title> #雑LT_study
pizzacat83
0
150
Google Apps Script で Ruby を動かす
kawahara
0
280
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
710
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
110
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
730
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
190
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
830
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
A Tale of Four Properties
chriscoyier
163
24k
Evolving SEO for Evolving Search Engines
ryanjones
0
260
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
210
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
250
Fireside Chat
paigeccino
42
4k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
410
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.5k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
430
Statistics for Hackers
jakevdp
799
230k
Transcript
Blazor WebAssembly Hostedのアプリに MessagePackを使ってみる 株式会社SAKURUG エンジニアリングユニット 草場 友光 .NETラボ 2023年1月
自己紹介 • 普段は主にWebFormsアプリの保守の お仕事をしてます。 • 古めのシステムが多いので時代に取り 残されぬよう新しい技術を一つでも入 れるよう日々努力しています。 • 2022/08-2023
Microsoft MVP (Developer Technologies) • tomo_kusaba
宣伝 【VISION】ひとの可能性を開花させる企業であり続ける VISIONに共感できる仲間募集中。
注意 • 個人の見解・解釈が多分に入っています。 • 見解の相違・事実誤認などありましたらご指摘ください。 • #dotnetlabでtweetすると右側に表示されます
今日の目的 • 通常、WebAPIのシリアライザとしてはJSONシリアライザが 使用されている。Webアプリケーションにおいてはパフォーマ ンスにおけるウェイトはデータベースやネットワークに比べシ リアライザーは少ないと考えられる。 • しかしながら、パフォーマンスチューニングは一般的に難しい • そこで、手軽なパフォーマンスアップの方法としてJSONシリ
アライザーをバイナリシリアライザであるMessagePack for C#に置き換えることでどれだけパフォーマンスアップできる か検証してみた
MessagePack for C#とは • C#用の超高速バイナリシリアライザ • .NET Standard2.0以上がターゲットで.NET Core 2.1以上向
けの最適化がされている • 河合さん(@neuecc)/Microsoft MVP for Developer Techologiesにより開発 • Visual Studio 2022の内部通信 • SignalRのMessagePack Hub • Blazor Serverプロトコル
MessagePack for C#とは
MemoryPackとは • 河合さんによる最新の超高速バイナリシリアライザ • .NET 7及びC#11に最適化
何で速いのか?? • この辺を読んでください • →https://neue.cc/2022/12/08_MemoryPackSessionInDo tNetConfRecapTokyo.html
通常のBlazor WebAssembly+WebAPI サーバー クライアント(ブラウザ) GET JSON (テキスト)
メリット・デメリット • メリット • OpenAPIのエコシステムを享受できる(Swaggerなど) • データのやりとりがテキストなので人間にも読める • デメリット •
テキストへのシリアライズのコストが高い
検証 • まずは、「WeatherForcast」のデモをMessagePackでシリ アライズ/デシリアライズして正常に画面表示できるかどうか を検証する • MessagePackでのパフォーマンスを最大限に引き出すことが 目的ではなく、いかに簡単にJSONシリアライザから MessagePackに置き換えるかを主眼に置いていることに留意 していただきたい。
検証ーController • Controllerは以下のように変更 • 戻り値の型を「IActionResult」 • JSONシリアラズされないようFileとして返す
検証ーShared • MessagePackObject属性をつける
検証ーClient • MessagePackでデシリアライズ
結果 • Weather forcastの表示ができました
サンプルの動作検証 • Edgeの開発者ツールで内容確認したところバイナリデータで 通信していると確認できます。
通常のWebアプリでは・・・ • データベースとネットワークの時間が無視できない。 • データベースとネットワークの時間の揺らぎが大きくそのまま ではシリアライズ・デシリアライズの差が出てくることが難し いのではと予想 • .NETはJITであるため初回と2回目以降の速度に大きく差が出 ると想定
今回の計測環境 • データベースの読み取りの揺らぎ対策 • サーバ内に結果をキャッシュし2回目以降は実データベースへ読みに 行かないようにする。 • 計測専用アプリであるので常に同じ結果を返す • ネットワークの揺らぎ対策
• Webアプリケーションサーバで実行する • JITによる揺らぎ対策 • 2回連続実行し2回目の値を採用する
サーバー側 _dataはSingletonでDI 2回目以降はデータありなのでDBアクセスなしに実行される
クライアント側 計測の2回目を有効な値とする (アドバイス thanks:とっちゃん) 以降、MessagePack、MemoryPackの計測に続く
クライアント側つづき
計測結果 • 各、20ループ JSON MessagePack MemoryPack 計測1 637ms 293ms 218ms
計測2 535ms 484ms 252ms 計測3 853ms 345ms 231ms 計測4 522ms 332ms 288ms 計測5 625ms 537ms 305ms 計測6 653ms 426ms 249ms 計測7 713ms 341ms 222ms 計測8 582ms 292ms 257ms 計測9 484ms 289ms 211ms 計測10 868ms 530ms 283ms 平均 647ms 387ms 252ms
今回の場合の結果 JSON MessagePack MemoryPack 平均 647ms 387ms 252ms 差 -260ms
-135ms サーバー側をWebAPIとしてシリアライザーをJSONからMessagePackまたはMemoryPack に置き換えただけの雑な実装でもそれなりにシリアライズ・デシリアライズ部分のパフォーマンス向上 は見られることは分かった。 しかし、実アプリケーションベースではどうだろうか??
実画面ベースでの実装 • 先ほどのWebAPIを流用し画面のみを制作 • 体感上、有意な変化があるのかそれぞれが判断して欲しい https://kind-moss-0af0a4d00.2.azurestaticapps.net/
実画面ベースでの比較(REST API) 783ms
実画面ベースでの比較(Memory Pack) 539ms
参考文献 • MessagePack for C#(Github) • MemoryPack(Github) • System.Text.Json名前空間
おしまい おしまい