Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TSのコードをRustで書き直した話
Search
asuka
January 22, 2025
Technology
1.3k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TSのコードをRustで書き直した話
RustのLT会#3
https://osaki-rs.connpass.com/event/341887/
asuka
January 22, 2025
More Decks by asuka
See All by asuka
GoとSIMDとWasmの今。
askua
3
630
2025年ふりかえり
askua
1
250
ライブラリを公開してメンテナンスした一年
askua
0
120
Wasmの気になる最新情報
askua
1
410
Wasmのエコシステムを使った ツール作成方法
askua
0
460
Pure Goで体験するWasmの未来
askua
1
1.1k
Wasmで社内ツールを作って配布しよう
askua
0
340
Wasm元年
askua
0
410
wstdなんだか良さそう
askua
0
160
Other Decks in Technology
See All in Technology
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
18
14k
Claude起点の仕様駆動開発
tanakaseiya
0
300
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
140
Amazon Bedrock Agents ClassicからAmazon Bedrock AgentCoreへ移行した際、ガードレール設定が2箇所に割れた話
matsunobu
0
170
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
300
覗いてみよう 関数型ビジュアル言語×2Dグラフィックスの世界
yohyamasaki
0
160
BedrockとLambdaで作る リアルタイム進行型推理ゲーム
kawametho
0
160
検証フェーズはAIの回答を判断するための学習機会
toru_kubota
2
340
[2026 Oracle Technical Deep Dive] エンタープライズAIエージェントを支えるOCIソリューション。ラインナップと特徴を理解しよう! (2026年9月17日開催)
oracle4engineer
PRO
0
260
カンファレンスに参加した後の浮遊感とセルフケア
pauli
0
300
企業の現実世界をグラフで写し取る
sansantech
PRO
0
240
認知負荷を吸収し、プロダクトをまたぐPR Preview基盤の設計事例
taiki45
2
570
Featured
See All Featured
From π to Pie charts
rasagy
1
380
Making the Leap to Tech Lead
cromwellryan
135
10k
Tell your own story through comics
letsgokoyo
1
1.1k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
6.3k
Evolving SEO for Evolving Search Engines
ryanjones
0
300
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
620
Designing for humans not robots
tammielis
254
26k
Why Our Code Smells
bkeepers
PRO
340
58k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
1
550
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
860
30 Presentation Tips
portentint
PRO
1
410
Transcript
TSのコードを Rustで書き直した話 2025.1.22 RustのLT会#3
asuka (@a_skua) • 株式会社モニクル/SWE ◦ Monicle Techbook vol.1 • WebAssemblyの同人誌を書いている人
◦ WebAssemblyでできること ▪ 商業誌:実践入門WebAssembly ◦ ご注文はWASIですか? ◦ ご注文はWASIですか?? ▪ 商業誌:WebAssembly System Interface入門 ◦ WebAssembly Cookbook vol.1 ◦ WebAssembly Cookbook vol.2 • 新宿御苑.devの運営,etc. ◦ 新宿御苑.wasm #2025.2.28 やります 2 WHOAMI 技術書典14 技術書典15 技術書典16 技術書典17 WASIのまとまった情報あります↓↓ ↑↑SNSのアイコンの本
TSのコードをRustで書き直した話
TSのコードをRustで書き直した話 • アドベントカレンダーの記事として投稿 • 2024年に書いたZennの記事で一番伸びた 4 Node.jsのメモリ使いすぎ問題
Rustで書き直した結果... - 1プロセス400MB以上メモリを使用 + サーバー全体で40MB程度に - 1プロセス90秒程度かかっていた処理 + 1プロセス10秒未満に TSのコードをRustで書き直した話
• アドベントカレンダーの記事として投稿 • 2024年に書いたZennの記事で一番伸びた 5 Node.jsのメモリ使いすぎ問題
記事では計測結果しか書いていない Rustで書き直した結果... - 1プロセス400MB以上メモリを使用 + サーバー全体で 40MB程度に - 1プロセス90秒程度かかっていた処理 +
1プロセス10秒未満に TSのコードをRustで書き直した話 • アドベントカレンダーの記事として投稿 • 2024年に書いたZennの記事で一番伸びた 6 Node.jsのメモリ使いすぎ問題 今日話たいこと • 良かったこと • 大変だったこと • 今後やりたいこと
良かったこと
1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 8
1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 9 TypeScript • Prismaの型をそのまま使いがち問題 •
結果Classを使わず,全てがObject • Classの使い勝手が微妙 JS Rust • struct と implで良い感じに type 手数料 = { 金額: number; 税率: number; is税抜き: boolean; }; function 税込手数料(手数料: 手数料): number { return is税抜き ? 手数料.金額 + (手数料.金額 * 手数料.税率) : 手数料.金額; } struct 手数料 { 金額: i32; 税率: i32; is税抜き: bool; ; impl 手数料 { fn 税込(&self) -> i32 { if self.is税抜き { self.金額 + (self.金額 * self.手数料.税率) } else { self.金額 } } }
1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 10 TypeScript • Prismaの型をそのまま使いがち問題 •
結果Classを使わず,全てがObject • Classの使い勝手が微妙 JS Rust • struct と implで良い感じに const 税込 = 税込手数料(手数料); let 税込 = 手数料.税込(); JSにもclassはあるが,classだと面倒な場面が たまにあるあるのでobject使いがち 意味を正しく集約できた
type Foo = { a: number; b: number; }; type
Bar = { a: number; b: number; }; 1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 11 TypeScript • Prismaの型をそのまま使いがち問題 • 結果Classを使わず,全てがObject • Classの使い勝手が微妙 JS Rust • struct と implで良い感じに struct Foo { a: i32, b: i32, } struct Bar { a: i32, b: i32, } FooとBarは同じ型 FooとBarは異なる型 オブジェクトで曖昧だった値を型として意味を持たせることができた
1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 12 TypeScript • パターンマッチがない •
所有権がない Rust • パターンマッチがある • 所有権がある impl Foo { fn 手数料(&self): Option<i32> { match (self.手数料1, self.手数料2, self.手数料3) { (Some(手数料1), _, _) => Some(手数料1), (None, Some(手数料2), _) => Some(手数料2), (None, None, 手数料3) => 手数料3, } } } function 手数料(foo: Foo): number | null { if (foo.手数料1 !== null) return foo.手数料1; if (foo.手数料2 !== null) return foo.手数料2; return foo.手数料3; }
1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 13 TypeScript • パターンマッチがない •
所有権がない Rust • パターンマッチがある • 所有権がある fn 対象年齢(&self) -> bool { match self.年齢 { Some(年齢) => (20..=65).contains(&年齢), _ => false, } } function 対象年齢(年齢: number | null): boolean { return 年齢 !== null ? 20 <= 年齢 && 年齢 <= 65 : false; } シンプルな例だが,これらの書き換えの積み重ねでコードが読みやすくなった
class Foo { foo() {} bar() {} } impl Foo
{ fn bar(&self) {} fn baz(self) {} } 1. 型やデータの責務がより明確になった 2. コーディング時のコードが読みやすくなった 良かったこと 14 TypeScript • パターンマッチがない • 所有権がない Rust • パターンマッチがある • 所有権がある &selfとselfを使い分けれるのが嬉しい 頑張って気をつける
大変だったこと
1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 16
1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 17 JSのデータ構造のイメージをそのまま持って来れないケースはある interface
Foo { bar: Bar } interface Bar {} struct Foo<'a> { bar: &'a Bar, } struct Bar {} これが意外と難しい
JSのデータ構造のイメージをそのまま持って来れないケースはある interface Foo { bar: Bar } interface Bar {}
struct Foo<'a> { bar: &'a Bar, } struct Bar {} これが意外と難しい 1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 18 interface Foo { bar: Bar } interface Bar {} struct Foo { bar: Bar, } struct Bar {} とりあえずクローンすることにした
1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 19 Cloud Buildでビルドに16分ほどかかる
1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 20 Cloud Buildでビルドに16分ほどかかる
2vCPUから8vCPUに変更して約4分に短縮
1. 参照かクローンか 2. ビルド時間 3. スクラッチイメージの作成 大変だったこと 21 TLSライブラリの依存解決できなかったのでalpineベースで作成 それでも約22MBのコンテナイメージに収まった
今後やりたいこと
• cloneをなくす • TSとRustのコードを1本化する 今後やりたいこと 23
• cloneをなくす • TSとRustのコードを1本化する 今後やりたいこと 24 Rcなどに置き換える & データ構造を見直す
• cloneをなくす • TSとRustのコードを1本化する 今後やりたいこと 25 RustからWasmにビルドしてTSのロジックを置き換える
2025.1.22 RustのLT会#3 TSのコードを Rustで書き直した話
同人誌 800円 27 今週土曜日1月25日),技書博11にて配布します 最新のWasmの動向を知りたい人向け 実装方法や活用事例など 商業誌 2,000円